我有这样的价值观:
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