Java 无法将减法运算符与Double.MAX_值一起使用

Java 无法将减法运算符与Double.MAX_值一起使用,java,double,precision,Java,Double,Precision,我正在尝试以下代码: Double a = Double.MAX_VALUE - (1000000000 * 100000000 * 1000000); System.out.println(a); 但是,结果仍然是1.7976931348623157E308(最大值为Double) 谁能给我解释一下吗?100000000*100000000*1000000是3个整数的乘法,这会导致溢出 即使您通过以下方式避免溢出: Double a = Double.MAX_VALUE - (1000000

我正在尝试以下代码:

Double a = Double.MAX_VALUE - (1000000000 * 100000000 * 1000000);
System.out.println(a);
但是,结果仍然是
1.7976931348623157E308
(最大值为Double)


谁能给我解释一下吗?

100000000*100000000*1000000
是3个整数的乘法,这会导致溢出

即使您通过以下方式避免溢出:

Double a = Double.MAX_VALUE - (1000000000.0 * 100000000.0 * 1000000.0);

您仍然可能看不到任何差异,因为您从
Double.MAX\u值中减去的数字与
Double.MAX\u值相比可以忽略不计(~1.797*10^308,比您试图从中减去的值大约大275个数量级)。

Double.MAX\u值太大了(请注意“E308”,这意味着写入的数字有308位),因此无论从中减去什么(尽管有Double.MAX\u值或near值),都将由于舍入错误而丢失。

首先,您有一个溢出

(1000000000 * 100000000 * 1000000);
这部分溢出,因此数字要小得多,您应该将其转换为double,如

(1000000000.0 * 100000000.0 * 1000000.0);

而且,double的精度有限,因此对大数字进行小运算可能不会产生正确的结果。

什么是
100000000*100000000*1000000
?为什么要这样做?可能是因为100000000*100000000*1000000与double相比太小了。最大值100000000*100000000*1000000太小了,但我不明白双精度类型减去它后的处理方式,可能是舍入误差。