Java 为什么这两者有不同的价值观?
它是Java 为什么这两者有不同的价值观?,java,Java,它是1.7e9 但是如果我用 Double milisecondsInYear = 365*24*3600*1000; 我得到了正确答案3.15E10除非您另有说明,否则Java中的数字是ints 当您添加时,您将进行双重计算(因为1000.0是double),而不是int,后者适合(不同于int)。第一步是执行整数数学,因为所有数字都是整数,结果是整数(然后将其扩大为double)。int的范围不足以产生结果。double或long是。因此,您也可以使用 Double miliseconds
1.7e9
但是如果我用
Double milisecondsInYear = 365*24*3600*1000;
我得到了正确答案
3.15E10除非您另有说明,否则Java中的数字是int
s
当您添加
时,您将进行双重计算(因为1000.0
是double
),而不是int
,后者适合(不同于int
)。第一步是执行整数数学,因为所有数字都是整数,结果是整数(然后将其扩大为double
)。int
的范围不足以产生结果。double
或long
是。因此,您也可以使用
Double milisecondsInYear = 365*24*3600*1000.;
首先加宽到long
。由于溢出,上面还输出“3.1536E10”。。365*24*3600*1000
不适合整数(有符号的32位值)。如果您将其写为365L*24*3600*1000
,则必要的促销将按正确的顺序进行,结果将是长的
,可以符合该数字
在第二行中,您有一个额外的字符,即末尾的点-这使数字成为浮点数,因此精度降低,但实际上您可以进行乘法。顺序或求值取决于您使用的类型。这就是为什么您会得到不同的答案。因为365
,24
、3600
和1000
都是int
文本,计算是使用int
s完成的。乘法溢出是因为真值超过了Integer.MAX\u值
。通过在末尾加一个点,可以将最后一个文本转换为double
文本。这对于c来说不是一种非常稳健的方法更正它,因为前3个数字的乘法仍然使用int
s执行。处理此问题的最佳方法是将第一个数字设为long
或double
literal
double millisecondsInYear = (365L * 24 * 3600 * 1000);
System.out.println(millisecondsInYear);
或
谢谢大家。这个错误让我有一段时间感到困惑。这里的顺序有什么关系?除了发布的正确答案之外。你的第一行无法编译。在左边你有一个Double
对象类型,在右边你有一个int
primitve,它们不兼容赋值。所以下次发布你使用的真实代码。我键入d这是在电话里。它是自动更正的。对不起。很遗憾,我不能为你的回答添加一个微笑。:-)
365L*24*3600*1000
365.0*24*3600*1000