比较 Double.MIN_VALUE 和 0

问题描述 投票:0回答:5

为什么这段代码不起作用?实际上,这只是一个大程序的一小部分。它必须将

Double.MIN_VALUE
与不同的值进行比较,它适用于除
0.
之外的所有值,为什么?谢谢!

double d = Double.MIN_VALUE;
if (0. > d) {
    System.out.println("OK");
}
java if-statement double
5个回答
4
投票

Double.MIN_VALUE
4.9E-324
。而且这不小于
0
。但实际上并不是
0

如果您打印

System.out.println(4.9E-324d > 0.);//this is true

从这个意义上说,

0.0000000000...0001 != 0。但它趋于0

同样的方法

4.9E-324d != 0 but tends to 0


2
投票

您正在进行小数比较。如果你说尝试这样的事情:

 System.out.println(0.000000000000001d == 0.);//print false

你会弄错的。如果我读 java 文档,它会说:

/**
 * A constant holding the smallest positive nonzero value of type
 * {@code double}, 2<sup>-1074</sup>. It is equal to the
 * hexadecimal floating-point literal
 * {@code 0x0.0000000000001P-1022} and also equal to
 * {@code Double.longBitsToDouble(0x1L)}.
 */

所以它接近于零,但不是真正的 0。


2
投票

Double.MIN_VALUE
对于Java中的常量来说实际上是一个不好的名字。它不适合
int.MIN_VALUE
。在 C# 中,它称为 Double.Epsilon,恕我直言,它更适合。

因此,

Double.MIN_VALUE
不是存在的最大负双精度值。恕我直言,最大的离散双精度数没有这样的常数。否则,最大负数是
Double.NEGATIVE_INFINITY


0
投票

Double.MIN_VALUE
等于十六进制浮点文字
0x0.0000000000001P-1022
并且也等于
Double.longBitsToDouble(0x1L).

所以你的条件不成立!


0
投票

如果您想要将一个值与最小的数字(具有最大幅度的负值)进行比较,您可能需要查看

Double.NEGATIVE_INFINITY
,Java 文档指出的是:

“保存 double 类型负无穷大的常量。它等于 Double.longBitsToDouble(0xfff0000000000000L) 返回的值。”

© www.soinside.com 2019 - 2024. All rights reserved.