Java 如果没有余数,双除法等于整数除法吗?
在JVM上,两个双精度值之间的除法是否总是产生与整数除法相同的精确结果 具备以下先决条件: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
- 无余数除法
- 不可除零
和x
实际上都包含整数值y
double x = ...;
int resultInt = ...;
double y = x * resultInt;
double resultDouble = y / x; // double division
resultDouble
是否始终等于resultInt
,或者是否会有精度损失?将int指定给double或float可能会失去精度有两个原因:
- 有些数字不能用double/float表示,因此它们最终是近似值
- 大整数可能在有效数字中包含过多精度
是,如果
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