为什么这段代码不起作用?实际上,这只是一个大程序的一小部分。它必须将
Double.MIN_VALUE
与不同的值进行比较,它适用于除 0.
之外的所有值,为什么?谢谢!
double d = Double.MIN_VALUE;
if (0. > d) {
System.out.println("OK");
}
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
您正在进行小数比较。如果你说尝试这样的事情:
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。
Double.MIN_VALUE
对于Java中的常量来说实际上是一个不好的名字。它不适合int.MIN_VALUE
。在 C# 中,它称为 Double.Epsilon,恕我直言,它更适合。
因此,
Double.MIN_VALUE
不是存在的最大负双精度值。恕我直言,最大的离散双精度数没有这样的常数。否则,最大负数是 Double.NEGATIVE_INFINITY
。
Double.MIN_VALUE
等于十六进制浮点文字 0x0.0000000000001P-1022
并且也等于 Double.longBitsToDouble(0x1L).
所以你的条件不成立!
如果您想要将一个值与最小的数字(具有最大幅度的负值)进行比较,您可能需要查看
Double.NEGATIVE_INFINITY
,Java 文档指出的是:
“保存 double 类型负无穷大的常量。它等于 Double.longBitsToDouble(0xfff0000000000000L) 返回的值。”