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