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太小了,但我不明白双精度类型减去它后的处理方式,可能是舍入误差。