21

我有这样的价值观:

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

问题是:为什么res等于0.0(而不是 ca. 0.131944)?它存储在double所以不应该四舍五入吧?

4

7 回答 7

31

当您使用二元运算符时,两个参数应该是相同的类型,结果也将是它们的类型。当你想把(int)/(long)它分成时(long)/(long),结果是(long)。您应该成功(double)/(long)(int)/(double)获得双重结果。(double)/(long)由于 double 大于 int 和 long,所以 int 和 long 将在和中变成 double(int)/(double)

于 2012-09-07T09:03:17.850 回答
20

因为你将 along除以 anint你会得到一个long结果。你实际上在做的是

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

原样millis/consta0当转换double为时0.0

尝试以下方法将 double 除以 int 并获得 double 结果。

double res = (double) millis/consta;

这与

double res = ((double) millis)/((double) consta));
于 2012-09-07T08:59:35.880 回答
4

你正在做long除法(int 被强制转换为 long)所以你得到long的值是整数(所以,0)

你应该做

  double res = (double) millis / consta;

一旦其中一个值被强制转换为双精度,另一个被强制转换,因此操作在两个运算符中使用相同的类型。

于 2012-09-07T09:00:07.440 回答
1

millis/consta是一个整数除法,结果是0. 在线铸造:

double res = millis/consta;

在结果上完成:

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

您需要做的是转换操作数之一:

double res = (double)millis/consta;
于 2012-09-07T08:59:45.427 回答
1

long 和 int 的结果类型将是 long,它不能保存小数。

您想在分配之前将其转换为双精度

于 2012-09-07T09:01:25.450 回答
0

发生这种情况时,它会自动向下转换为 int 以执行操作。你写它像:

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

它会起作用。

于 2012-09-07T09:00:38.703 回答
0

这是因为 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
于 2012-09-07T09:11:08.073 回答