【发布时间】:2015-11-05 15:07:57
【问题描述】:
Java 8 给了我们Math.addExact() 整数,但不是小数。
double 和 BigDecimal 是否有可能溢出?从Double.MAX_VALUE 和How to get biggest BigDecimal value 来看,答案是肯定的。
因此,为什么我们不为这些类型也设置Math.addExact()?自己检查这一点的最可维护的方法是什么?
【问题讨论】:
-
理论上,任何有限精度都可能溢出。
-
支持 double 的 addExact 要困难得多,因为它首先是一个近似表示。你甚至不能精确地添加 0.1 和 0.2。 BigDecimal 的溢出非常大,您可能首先会耗尽内存。
-
如果双打你走得太远以至于它不能再被表示你会得到一个
Infinity值。那将是溢出。 -
@EdwinDalorzo 如果
Infinity已经是输入之一怎么办?这是浮点运算的有效输入。 -
Double 可以溢出,但它不像序数类型那样环绕。 underflow 浮点可以做什么,整数类型绝对不能做什么:一个非常接近于零的结果,它必须四舍五入为零。
BigDecimal可以和你的内存一样大(或多或少),所以虽然理论上它可以溢出,但实际上它不会。除非您正在计算 Ackermann 函数的值 :)
标签: java double bigdecimal integer-overflow