我似乎无法找到为什么这两个表达式评估不同的结果。有人能够启发我吗?为什么这两个表达式评估为不同的值?
double var1 = 53, var2 = 51.95;
int res1 = (int)((var1 - var2)*100);
int res2 = (int)(var1*100 - var2*100);
Output: res1 = 104 res2 = 105
我似乎无法找到为什么这两个表达式评估不同的结果。有人能够启发我吗?为什么这两个表达式评估为不同的值?
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的值是多少。例如,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.
感谢您的链接和答案。 – JohnnyNo5 2014-10-08 03:28:57
尝试使用System.out打印出一些中间值('var1','var2','(var1-var2)* 100'和'var1 * 100-var2 * 100')。的printf( “%24.20f \ n” 个)'。结果应该解释发生了什么。而且,这个问题在这里被非常频繁地询问。下次请在发布之前更勤勉地搜索。 – 2014-10-08 03:17:20