在JVM上,两个double值之间的除法是否总是产生与整数除法相同的精确结果?
具备以下先决条件:
x
和y
实际上都包含整数值。E.g。在以下代码中
double x = ...;
int resultInt = ...;
double y = x * resultInt;
double resultDouble = y / x; // double division
resultDouble
总是等于resultInt
还是会有一些精度损失?
答案 0 :(得分:4)
将int赋值给double或float可能会失去精度有两个原因:
因此它依赖于int的大小,但在Java中,double使用52位尾数,因此能够表示32位整数而不会丢失数据。
这两个网站中有很多例子:
1- Java's Floating-Point (Im)Precision
2- About Primitive Data Types In Java
还要检查:
答案 1 :(得分:3)
是的,如果x
和y
都在int
范围内,则除非分为-2147483648.0 / -1.0
。在这种情况下,double结果将匹配整数除法的结果,但不匹配int
除法。
如果两个除法输入都在int
范围内,则它们都可以完全表示为double
。如果它们的比率是整数且除法不是-2147483648.0 / -1.0
,则比率在int
范围内,因此可以完全表示为double
。 double
是与除法结果最接近的值,因此必须是double
除法的结果。
如果x
和y
是int
范围之外的整数,则此推理不一定适用。
答案 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