我有这样的价值观:
long millis = 11400000;
int consta = 86400000;
double res = millis/consta;
问题是:为什么res
等于0.0
(而不是 ca. 0.131944
)?它存储在double
所以不应该四舍五入吧?
当您使用二元运算符时,两个参数应该是相同的类型,结果也将是它们的类型。当你想把(int)/(long)
它分成时(long)/(long)
,结果是(long)
。您应该成功(double)/(long)
或(int)/(double)
获得双重结果。(double)/(long)
由于 double 大于 int 和 long,所以 int 和 long 将在和中变成 double(int)/(double)
因为你将 along
除以 anint
你会得到一个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)所以你得到long
的值是整数(所以,0)
你应该做
double res = (double) millis / consta;
一旦其中一个值被强制转换为双精度,另一个被强制转换,因此操作在两个运算符中使用相同的类型。
millis/consta
是一个整数除法,结果是0
. 在线铸造:
double res = millis/consta;
在结果上完成:
double res = (double)(millis/consta);
您需要做的是转换操作数之一:
double res = (double)millis/consta;
long 和 int 的结果类型将是 long,它不能保存小数。
您想在分配之前将其转换为双精度
发生这种情况时,它会自动向下转换为 int 以执行操作。你写它像:
long millis = 11400000;
int consta = 86400000;
double res = ((double)millis)/((double)consta);
它会起作用。
这是因为 long:long 数据类型是 64 位有符号二进制补码整数。int:int 数据类型是一个 32 位有符号二进制补码整数。
请参阅原始类型 这意味着两者都是整数。由于我们将 long 除以整数,结果是 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