乘法结果不正确

时间:2014-04-25 17:03:31

标签: java

我试图理解为什么这种乘法会导致错误的值:

long max = (60 * 24 * 60 * 60 * 1000);

这应该= 5,184,000,000

但在我的Java程序中它= 889,032,704

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:14)

您所乘的所有值都是int s,因此结果为int,在溢出已经发生后转换为long。将其中一个因子设为long,以便使用64b指令将它们相乘

尝试

long max = (60L * 24L * 60L * 60L * 1000L);

L后缀指定常量是long值,而不是int常量。

language specification

  

如果整数文字后缀为ASCII字母L或l(ell),则其类型为long;否则它是int类型(§4.2.1)。

section on multiplication

  

乘法表达式的类型是其操作数的提升类型。

两个int

type promotion将其留作int s:

  

应用扩展基元转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:

     
      
  • 如果任一操作数的类型为double,则另一个操作数将转换为double
  •   
  • 否则,如果任一操作数的类型为float,则另一个操作数将转换为float
  •   
  • 否则,如果任一操作数的类型为long,则另一个操作数将转换为long
  •   
  • 否则,两个操作数都将转换为int
  • 类型   

答案 1 :(得分:5)

这是由于整数溢出造成的。您的右侧产品表示为int(所有操作数的默认类型),并且它无法保留您的“长”值。

只需将您的产品long的第一个因素设为长期常数60L,如迈克的答案,或明确地(long) 60

long max = (long) 60 * 24 * 60 * 60 * 1000;

你会得到你期望的。