我有这样的价值观:
long millis = 11400000;
int consta = 86400000;
double res = millis/consta;
问题是:为什么res
等于0.0
(而不是约0.131944
)?它存储在double
中,所以应该没有向右舍入?
答案 0 :(得分:24)
当您使用二元运算符时,两个参数应该是相同的类型,结果也将是它们的类型。如果要将(int)/(long)
除以(long)/(long)
,结果为(long)
。你应该让它(double)/(long)
或(int)/(double)
来获得双重结果。由于double大于int和long,因此int和long将在(double)/(long)
和(int)/(double)
答案 1 :(得分:19)
因为您要将long
除以int
,所以会得到long
个结果。
你实际做的是
double res = (double) (millis/consta);
millis/consta
为0
,投放到double
时为0.0
尝试以下操作将双重除以int并获得双重结果。
double res = (double) millis/consta;
与
相同double res = ((double) millis)/((double) consta));
答案 2 :(得分:3)
你正在进行long
除法(int被强制转换为长),因此得到long
个值,这是整数(所以,0)
你应该做
double res = (double) millis / consta;
一旦其中一个值被转换为double,另一个值被过度转换,因此操作在两个运算符中使用相同的类型。
答案 3 :(得分:1)
millis/consta
是整数除法,结果为0
。在线投射:
double res = millis/consta;
完成了结果:
double res = (double)(millis/consta);
你需要做的是施放一个操作数:
double res = (double)millis/consta;
答案 4 :(得分:1)
long和int devision的结果类型将是long,不能包含小数。
你想在分配它之前将它强制转换为双重
答案 5 :(得分:0)
当发生这种情况时,它会自动向下转换为int以执行操作。你写得像:
long millis = 11400000;
int consta = 86400000;
double res = ((double)millis)/((double)consta);
它会起作用。
答案 6 :(得分:0)
这是因为 long:长数据类型是64位带符号的二进制补码整数。 int:int数据类型是32位带符号的二进制补码整数。
See Primitive type 这意味着两者都是整数。 由于我们将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