2014-10-08 130 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

相關問題