为什么这两个值不同?

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

这是1.7e9

但如果使用

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

我得到了正确答案3.15E10


2
除了正确的答案之外,你的第一行代码无法编译。在左边你使用了一个“Double”对象类型,在右边你使用了一个“int”基本类型,它们不兼容赋值。所以下次请发布你真正使用的代码。 - SubOptimal
我是在手机上打的,它自动纠正了。抱歉。 - Jumpworker
很遗憾我不能在你的回答里添加一个笑脸。:-) - SubOptimal
5个回答

5

因为3652436001000都是int字面量,所以计算使用的是int。由于真实值超过了Integer.MAX_VALUE,乘法溢出了。在最后一个字面量末尾加上一个小数点将其转换为double字面量,这并不是一种非常稳健的纠正方法,因为前三个数字的乘法仍然使用int进行。处理这个问题的最佳方法是将第一个数字变成longdouble字面量。

365L*24*3600*1000

或者

365.0*24*3600*1000

3
由于溢出的原因,365*24*3600*1000 不能适应int(有符号32位值)。如果将其写作 365L*24*3600*1000,则必要的提升将以正确的顺序发生,并且结果将是一个可以容纳该数字的long
在第二行中,您有一个额外的字符,即末尾的点号,这使数字成为浮点数,因此您会失去精度,但实际上您可以进行乘法运算。

1
Java中的数字默认是int类型,除非你另有说明。
当你添加“.”时,你会得到double类型的计算(因为1000.0是double类型),而不是int类型,这样更适合(与int类型不同)。

1

首先是执行整数运算,因为所有数字都是整数,结果是一个整数(然后扩展为double)。int的范围不足以容纳结果。可以使用doublelong。因此,您也可以使用

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

首先需要将其扩展为long类型。上述代码还会输出"3.1536E10"。


0

根据您使用的类型,顺序或评估会有所不同。这就是为什么您会得到不同的答案。


谢谢大家。这个 bug 卡了我一段时间。 - Jumpworker
2
这里的顺序有什么影响? - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接