Double milisecondsInYear = 365*24*3600*1000;
它是1.7e9
但如果我用
Double milisecondsInYear = 365*24*3600*1000.;
我得到了正确答案3.15E10
答案 0 :(得分:5)
由于365
,24
,3600
和1000
都是int
文字,因此使用int
s进行计算。乘法溢出,因为真值超过Integer.MAX_VALUE
。通过在末尾添加一个点,您可以将最后一个文字转换为double
字面值。这不是一种非常强大的纠正方法,因为前3个数字的乘法仍然使用int
来执行。处理此问题的最佳方法是将第一个数字设为long
或double
字面值。
365L*24*3600*1000
或
365.0*24*3600*1000
答案 1 :(得分:3)
因为溢出。 365*24*3600*1000
不适合int(这是一个带符号的32位值)。如果您将其写为365L*24*3600*1000
,那么必要的促销活动将以正确的顺序进行,结果将是long
,这可以适合该数字。
在第二行中,你有一个额外的字符,最后一个点 - 这使得数字成为一个浮点数,因此你的精度会下降,但你实际上可以进行乘法。
答案 2 :(得分:1)
Java中的数字是int
s,除非您另行指定。
当您添加.
时,您将进行double
次计算(因为1000.0
为double
)而不是int
,这符合{int
1}})。
答案 3 :(得分:1)
第一个是执行整数数学,因为所有数字都是整数,结果是一个整数(然后加宽到double
)。 int
的范围不足以获得结果。 double
或long
是{。}}。所以,你也可以使用
double millisecondsInYear = (365L * 24 * 3600 * 1000);
System.out.println(millisecondsInYear);
首先扩大到long
。以上也输出“3.1536E10”。
答案 4 :(得分:0)
订单或评估因您使用的类型而异。那或者是你得到不同答案的原因。