如果没有余数,双除法是否等于整数除法?

时间:2017-05-16 15:17:50

标签: java floating-point jvm

在JVM上,两个double值之间的除法是否总是产生与整数除法相同的精确结果?

具备以下先决条件:

  • 没有余数的分部
  • 不归零
  • xy实际上都包含整数值。

E.g。在以下代码中

double x = ...;
int resultInt = ...;
double y = x * resultInt;
double resultDouble = y / x; // double division

resultDouble总是等于resultInt还是会有一些精度损失?

3 个答案:

答案 0 :(得分:4)

将int赋值给double或float可能会失去精度有两个原因:

  • 有些数字不能表示为double / float,因此它们最终接近
  • 大整数可能在租约有效数字
  • 中包含太多精度

因此它依赖于int的大小,但在Java中,double使用52位尾数,因此能够表示32位整数而不会丢失数据。

这两个网站中有很多例子:

1- Java's Floating-Point (Im)Precision

2- About Primitive Data Types In Java

还要检查:

Loss of precision - int -> float or double

答案 1 :(得分:3)

是的,如果xy都在int范围内,则除非分为-2147483648.0 / -1.0。在这种情况下,double结果将匹配整数除法的结果,但不匹配int除法。

如果两个除法输入都在int范围内,则它们都可以完全表示为double。如果它们的比率是整数且除法不是-2147483648.0 / -1.0,则比率在int范围内,因此可以完全表示为doubledouble是与除法结果最接近的值,因此必须是double除法的结果。

如果xyint范围之外的整数,则此推理不一定适用。

答案 2 :(得分:3)

该语句为真,但Integer.MIN_VALUE除外,其中两个整数除法的结果可能超出整数范围。

    int n = Integer.MIN_VALUE;
    int m = -1;
    System.out.println(n / m);                          // -2147483648
    System.out.println((int) ((double)n / (double)m));  // 2147483647