为什么这两个有不同的价值?

时间:2015-01-13 15:03:35

标签: java

Double milisecondsInYear = 365*24*3600*1000;

它是1.7e9

但如果我用

Double milisecondsInYear = 365*24*3600*1000.;

我得到了正确答案3.15E10

5 个答案:

答案 0 :(得分:5)

由于3652436001000都是int文字,因此使用int s进行计算。乘法溢出,因为真值超过Integer.MAX_VALUE。通过在末尾添加一个点,您可以将最后一个文字转换为double字面值。这不是一种非常强大的纠正方法,因为前3个数字的乘法仍然使用int来执行。处理此问题的最佳方法是将第一个数字设为longdouble字面值。

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.0double)而不是int,这符合{int 1}})。

答案 3 :(得分:1)

第一个是执行整数数学,因为所有数字都是整数,结果是一个整数(然后加宽到double)。 int的范围不足以获得结果。 doublelong是{。}}。所以,你也可以使用

double millisecondsInYear = (365L * 24 * 3600 * 1000);
System.out.println(millisecondsInYear);

首先扩大到long。以上也输出“3.1536E10”。

答案 4 :(得分:0)

订单或评估因您使用的类型而异。那或者是你得到不同答案的原因。