2013-10-17 30 views
-1

我有一個相當簡單的表達式,我想要評估哪一個是ZoomLevel = ZoomLevel - 0.1,其中ZoomLevel被聲明爲double。爲什麼1.2 - 0.1在C#中變成1.09?

我稱例程多次:

  • 1.5 - 0.1 = 1.4
  • 1.4 - 0.1 = 1.3
  • 1.3 - 0.1 = 1.2

然後是時間執行ZoomLevel等於1.2時的相同語句: enter image description here

Then我跨過聲明:

enter image description here

爲什麼這種說法評估爲1.09,而不是1.1?

(我猜它有事情做與在執行雙精度不夠。)

編輯:這是我得到之前和語句執行後打印縮放級別的內容時。

?string.Format("{0:N20}", ZoomLevel); 
"1,20000000000000000000" 
?string.Format("{0:N20}", ZoomLevel); 
"1,09000000000000000000" 
+0

不錯的猜測http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems – Steve

+5

我在SO上隨機挑選了一篇文章,當時投票結果爲重複。做一個搜索,它被一遍又一遍地回答。 –

+0

你能展示'ZoomLevel'的實現嗎? –

回答

2

這是因爲雙打是二進制浮點數。由於我們人類喜歡看到十進制數字,所以他們會轉換成十進制數字,但是對於某些數值來說,這種轉換並不精確。因此可能會發生舍入錯誤。

0

我敢打賭其實際上是1.0999(9)。

你必須在.NET中閱讀一些關於double的內容。

相關問題