为什么这两个表达式会评估不同的值?

时间:2014-10-08 03:03:52

标签: java

我似乎无法找到为什么这两个表达式会评估不同的结果。有人可以开导我吗?

double var1 = 53, var2 = 51.95;
int res1 = (int)((var1 - var2)*100);
int res2 = (int)(var1*100 - var2*100);

Output: res1 = 104   res2 = 105

1 个答案:

答案 0 :(得分:6)

浮点数无法准确存储所有值,特别是它们无法准确存储所有小数值。 51.95无法存储在double中 - 您真正存储的内容是关闭到该值。将几乎但不相当的值乘以100时,会放大该错误。 res1res2以稍微不同的方式执行此操作,因此结果略有不同并不令人惊讶。

这里有更多细节。

您可以使用this converter来确定双重值的真实含义。例如,51.95具有01000010010011111100110011001101的二进制表示,并且对应于十进制数51.95000076293945。这是var2真实值;它是双人可以代表的最接近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。

相关问题