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

时间:2012-09-07 08:57:51

标签: java int double division

我有这样的价值观:

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

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

7 个答案:

答案 0 :(得分:24)

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

中变为double

答案 1 :(得分:19)

因为您要将long除以int,所以会得到long个结果。 你实际做的是

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

millis/consta0,投放到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