我似乎無法找到爲什麼這兩個表達式評估不同的結果。有人能夠啓發我嗎?爲什麼這兩個表達式評估爲不同的值?
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