java - 如何比较 Double.MAX_VALUE

标签 java

我想检查 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/

相关文章:

java - 无法通过 selenium WebDriver 上的 "isDisplyed"检查 WebElement 是否存在

java - 如何检查字符串数组中的元素是否为空?

java - 如何在Android中使用Java设置可编辑的EditText?

java - ImageIO.read 在多线程执行中抛出异常

java - 如何使用 VisualVM 分析 Java 应用程序?

java - 在嵌套文档中按查询分组

java - 由于图像按钮强制关闭

java - 来自单独线程的 GUI

java - React Native - 值 '3130049174' 不适合 32 位有符号整数

java - ehcache putAll 操作线程安全且原子吗?