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方法.当然,您可以随时将自己的实现添加到您自己的应用程序中的实用程序类中.