2014-10-08 116 views
0

我似乎无法找到为什么这两个表达式评估不同的结果。有人能够启发我吗?为什么这两个表达式评估为不同的值?

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

Output: res1 = 104 res2 = 105 
+0

尝试使用System.out打印出一些中间值('var1','var2','(var1-var2)* 100'和'var1 * 100-var2 * 100')。的printf( “%24.20f \ n” 个)'。结果应该解释发生了什么。而且,这个问题在这里被非常频繁地询问。下次请在发布之前更勤勉地搜索。 – 2014-10-08 03:17:20

回答

6

浮点不能精确地存储所有的值,特别是它们不能精确地存储所有的十进制值。 51.95不能存储在double - 你真的存储的是关闭到那个值。当你乘以100的几乎不安全值时,你会放大该错误。 res1res2以略有不同的方式做到这一点,所以他们得到稍微不同的结果应该不会令人感到意外。

这里有一些细节。

您可以使用this converter来确定double的值是多少。例如,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 is 105.

+0

感谢您的链接和答案。 – JohnnyNo5 2014-10-08 03:28:57

相关问题