Double milisecondsInYear = 365*24*3600*1000;
这是1.7e9
但如果使用
Double milisecondsInYear = 365*24*3600*1000.;
我得到了正确答案3.15E10
Double milisecondsInYear = 365*24*3600*1000;
这是1.7e9
但如果使用
Double milisecondsInYear = 365*24*3600*1000.;
我得到了正确答案3.15E10
因为365
、24
、3600
和1000
都是int
字面量,所以计算使用的是int
。由于真实值超过了Integer.MAX_VALUE
,乘法溢出了。在最后一个字面量末尾加上一个小数点将其转换为double
字面量,这并不是一种非常稳健的纠正方法,因为前三个数字的乘法仍然使用int
进行。处理这个问题的最佳方法是将第一个数字变成long
或double
字面量。
365L*24*3600*1000
或者
365.0*24*3600*1000
365*24*3600*1000
不能适应int(有符号32位值)。如果将其写作 365L*24*3600*1000
,则必要的提升将以正确的顺序发生,并且结果将是一个可以容纳该数字的long
。首先是执行整数运算,因为所有数字都是整数,结果是一个整数(然后扩展为double
)。int
的范围不足以容纳结果。可以使用double
或long
。因此,您也可以使用
double millisecondsInYear = (365L * 24 * 3600 * 1000);
System.out.println(millisecondsInYear);
首先需要将其扩展为long
类型。上述代码还会输出"3.1536E10"。
根据您使用的类型,顺序或评估会有所不同。这就是为什么您会得到不同的答案。