Java 如果没有余数,双除法等于整数除法吗?

Java 如果没有余数,双除法等于整数除法吗?,java,floating-point,jvm,Java,Floating Point,Jvm,在JVM上,两个双精度值之间的除法是否总是产生与整数除法相同的精确结果 具备以下先决条件: 无余数除法 不可除零 x和y实际上都包含整数值 例如,在以下代码中 double x = ...; int resultInt = ...; double y = x * resultInt; double resultDouble = y / x; // double division resultDouble是否始终等于resultInt,或者是否会有精度损失?将int指定给double或flo

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

具备以下先决条件:

  • 无余数除法
  • 不可除零
  • x
    y
    实际上都包含整数值
例如,在以下代码中

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

resultDouble
是否始终等于
resultInt
,或者是否会有精度损失?

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

  • 有些数字不能用double/float表示,因此它们最终是近似值
  • 大整数可能在有效数字中包含过多精度
所以它取决于int的大小,但在Java中,double使用52位尾数,因此能够表示32位整数而不会丢失数据

在这两个站点中,有许多精彩的例子:

同时检查:


是,如果
x
y
都在
int
范围内,除非除法为
-2147483648.0/-1.0
。在这种情况下,双精度结果将匹配整数除法的结果,但不匹配
int
除法

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


如果
x
y
int
范围外的整数,则此推理不一定适用。

除了
Integer.MIN\u VALUE
之外,该语句为真,其中两个整数的除法结果可能超出整数范围

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

只有40亿32位整数。您可以通过枚举所有值来测试这一点。您的语句并不总是正确的:
-2147483648.0/-1.0!=-2147483648/-1