加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 可以加倍或BigDecimal溢出?

发布时间:2020-12-14 16:37:20 所属栏目:Java 来源:网络整理
导读:Java 8给了我们 Math.addExact()整数,但不是小数. Double和BigDecimal是否可能溢出?根据Double.MAX_VALUE和How to get biggest BigDecimal value判断,我会说答案是肯定的. 因此,为什么我们不需要Math.addExact()这些类型?什么是最可维护的方式来检查这个?
Java 8给了我们 Math.addExact()整数,但不是小数.

Double和BigDecimal是否可能溢出?根据Double.MAX_VALUE和How to get biggest BigDecimal value判断,我会说答案是肯定的.

因此,为什么我们不需要Math.addExact()这些类型?什么是最可维护的方式来检查这个?

解决方法

双重溢出到Infinity和-Infinity,它不会绕过. BigDecimal不会溢出,期间,它只受计算机内存量的限制.见: How to get biggest BigDecimal value

与.addExact之间的唯一区别是它尝试检测是否发生溢出,并抛出异常而不是包装.这是源代码:

public static int addExact(int x,int y) {
    int r = x + y;
    // HD 2-12 Overflow iff both arguments have the opposite sign of the result
    if (((x ^ r) & (y ^ r)) < 0) {
        throw new ArithmeticException("integer overflow");
    }
    return r;
}

如果你想检查是否发生溢出,从某种意义上说,使用双精度来做更简单,因为你可以简单地检查Double.POSITIVE_INFINITY或Double.NEGATIVE_INFINITY;在int和long的情况下,它是一个稍微更复杂的事情,因为它不总是一个固定值,但在另一个可以是输入(例如Infinity 10 = Infinity,你可能不想抛出一个异常这个案例).

由于所有这些原因(我们甚至还没有提到NaN),这可能是为什么在JDK中不存在这样的addExact方法.当然,您可以随时将自己的实现添加到您自己的应用程序中的实用程序类中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读