长整型/整型除法出现意外结果

21

我有这样的数值:

long millis = 11400000;
int consta = 86400000;
double res = millis/consta;
问题是:为什么`res`等于`0.0`(而不是约为`0.131944`)?它被存储在`double`类型中,所以不应该有四舍五入的情况,为什么会出现这种情况呢?
7个回答

33

当您使用二进制运算符时,两个参数应该是相同的类型,结果也将是它们的类型。当您想要除以(int)/(long)时,它会变成(long)/(long),结果是(long)。要获得double结果,您应该使其变为(double)/(long)(int)/(double)。由于double比int和long更大,因此在(double)/(long)(int)/(double)中,int和long将被转换为double。


20

因为你正在将一个 long 除以一个 int,所以你会得到一个 long 的结果。 实际上你在做的是

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

当将millis/consta强制转换为double时,其值为0.0,尝试以下方法将一个双精度浮点数除以一个整数并得到一个双精度浮点数的结果。

double res = (double) millis/consta;

这与之相同。

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

4

您正在进行长除法(整数转换为长整型),因此您得到的是长整型值,它们是整数(因此为0)。

您应该这样做:

  double res = (double) millis / consta;

一旦其中一个值被转换为double类型,另一个值也会被转换为double类型,因此操作将在两个运算符中使用相同的类型。


这是最好的和正确的答案。 - Shark

1

millis/consta 是一个整数除法,其结果为 0。该行中的强制类型转换:

double res = millis/consta;

对结果进行处理:

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

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

double res = (double)millis/consta;

1
长整型和整型相除的结果将会是一个长整型,无法保留小数点。

在赋值之前,您需要将其转换为双精度浮点型。


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

0
当发生这种情况时,它会自动降级为int执行操作。可以这样写:
long millis = 11400000;
int consta = 86400000;
double res = ((double)millis)/((double)consta);

它会起作用的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接