2011-11-11 69 views
1

我剛剛發現了一些奇怪的在我的代碼印刷浮點值安慰精密problem_

我創建簡單的應用程序,以顯示你有什麼我談論

float Test1 = 112.12; 
float Test2 = 0.12; 

printf("Test1 %15f", Test1); 
printf("Test1 %15f", Test1); 

我一直認爲,如果我寫的Test1 = 112.12這意味着它等於112.120000000

但是我得到112.120003

並在第二個例子中,我得到0.11999或0.120000這取決於

有人能解釋我爲什麼會出現這種情況會發生什麼,如果我嘗試這兩個數字將他們得到轉換爲double(或任何其他更精確的數據類型)劃分,所以我可以得到更高的精度,否則會在使用它們的當前形式(浮點)

我已經使用VS 2010中測試該(如果它的事項)

回答

2

兩個意見:

  1. 計算機使用基體2,而不是基座10
  2. 浮點numbe rs不準確

由於第一點,有一些數字不能很好地從我們的系統轉換到計算機系統。 0.3不能100%精確地代表直接二進制(這並不是說計算機無法精確表示它,只是它們不能用於常用系統)。

因爲第二點,它總是危險的使用浮點數的精確值。我會推薦閱讀關於浮點數的維基百科文章 - 它提到了準確性問題。

+0

是的,我同意但不是更合乎邏輯它將數字「降低」到更低的值,如0.119999不是更高的值,然後我像第一個示例那樣輸入 – user996937

+0

@ user996937 - 沒有「舍入」我只是給它一個它不能完全表示的數字,而這是它能夠提供的最好的數字。 –

0

這與方法電腦專賣店號碼做。檢查這兩個維基百科文章

不要使用float除非你真的不得不這樣做。改爲使用double

+1

沒有必要虔誠地避免漂浮物。事實上,我聽到人們說完全相反。使用最適合你和你的要求的東西。 –

+0

@MattFenwick他們有理由嗎?在正常的,不太古老的消費級硬件上,當你有選擇的時候,選擇我所知道的唯一原因是空間,如果你有它們的_lot_。 –