我似乎无法找到为什么这两个表达式计算出不同的结果。有人可以启发我吗?
double var1 = 53, var2 = 51.95;
int res1 = (int)((var1 - var2)*100);
int res2 = (int)(var1*100 - var2*100);
Output: res1 = 104 res2 = 105
最佳答案
浮点无法精确存储所有值,特别是它们无法精确存储所有十进制值。 51.95 无法存储在 double
中 - 您真正存储的是接近该值。当您将几乎但不完全的值乘以 100 时,就会放大该误差。 res1
和 res2
执行此操作的方式略有不同,因此它们得到略有不同的结果也就不足为奇了。
这里有更多细节。
您可以使用this converter弄清楚 double 的真正值(value)是什么。例如,51.95 的二进制表示形式为 01000010010011111100110011001101
,对应于十进制数 51.95000076293945。这是 var2
的真实值;这是 double 可以表示的最接近 51.95 的数字。 var1
就是它看起来的样子,53。
那么,我们首先看一下 res1
。 53 - 51.95000076293945 是 1.04999923706055。使用该转换器,我们发现该值不能精确地存储在 double 型中;你实际上会得到什么 1.0499992。将其乘以 100,得到 104.99992,它被截断为 int 104。
现在res2
。 53*100是5300,51.95000076293945*100是5195.000076293945,实际上是5195.0。 5300-5195.0 是 105。
关于java - 为什么这两个表达式计算出不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26248582/