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/consta
为0
,当转换为double
为0.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