long / int除法中出现意外结果

我有这样的价值观:

long millis = 11400000; int consta = 86400000; double res = millis/consta; 

问题是:为什么res等于0.0 (而不是大约0.131944 )? 它存储在double所以应该没有向右舍入?

当您使用二元运算符时,两个参数应该是相同的类型,结果也将是它们的类型。 当你想要除(int)/(long)它变成(long)/(long) ,结果是(long) 。 你应该使用它(double)/(long)(int)/(double)来获得双重结果。 由于double大于int和long,int和long将变为double (double)/(long)(int)/(double)

因为你将long除以int会得到很long结果。 你实际做的是

 double res = (double) (millis/consta); 

millis/consta0 ,当转换为double0.0

尝试以下操作将double除以int并获得double结果。

 double res = (double) millis/consta; 

这是一样的

 double res = ((double) millis)/((double) consta)); 

你正在进行long除法(int得到强制转换)所以得到long整数值(所以,0)

你应该做

  double res = (double) millis / consta; 

一旦其中一个值被转换为double,另一个值就过度生成,因此操作在两个运算符中使用相同的类型。

millis/consta是一个整数除法,结果为0 。 线上铸造:

 double res = millis/consta; 

在结果上完成:

 double res = (double)(millis/consta); 

你需要做的是投出一个操作数:

 double res = (double)millis/consta; 

结果类型的long和int devision将是一个long,它不能包含小数。

您希望在分配之前将其强制转换为双精度数

发生这种情况时,它会自动向下转换为int以执行操作。 你写得像:

 long millis = 11400000; int consta = 86400000; double res = ((double)millis)/((double)consta); 

它会工作。

这是因为long:long数据类型是64位带符号的二进制补码整数。 int:int数据类型是32位带符号的二进制补码整数。

请参阅原始类型它表示两者都是整数。 由于我们将long除以整数,因此结果为长0.但是您将此值赋给res(double)值并打印它。 因此显示结果0.0。

 long millis = 11400000; int consta = 86400000; System.out.println("millis/consta = " + millis/consta); // print 0 double res = millis/consta; System.out.println("Res " + res); // print 0.0