我想检查 double 是否有 Double.MAX_VALUE
。
这是正确的方法吗(版本 1):
boolean hasMaxVal(double val){
return val == Double.MAX_VALUE;
}
或者我需要做这样的事情(版本 2):
boolean hasMaxVal(double val){
return Math.abs(val - Double.MAX_VALUE) < 0.00001
}
最佳答案
Java 的 double
类型是 double-precision IEEE 754 float 。这意味着尾数中有 53 位精度,因此数字的精度限制为十进制格式的大约 16 位有效数字。
Double.MAX_VALUE
约为 1.798×10308,因此第 16 位有效数字的量级约为 10308 - 16 = 10292。我们可以使用 Math.ulp
方法确认这一点,该方法返回一个 double
值的“最小精度单位”:
> Double.MAX_VALUE
1.7976931348623157E308
> Math.ulp(Double.MAX_VALUE)
1.9958403095347198E292
这意味着如果您确实想测试“接近于”Double.MAX_VALUE
的值,则只有在至少 2E292
的 epsilon 内这样做才有意义. 0.00001
的 epsilon 太小了,除了 Double.MAX_VALUE
本身之外,该范围内没有任何值,因此您的测试等同于 val == Double.MAX_VALUE
.
关于java - 如何比较 Double.MAX_VALUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60204144/