2013-05-10 179 views
-1

我在C#中將Decimal轉換爲Double時遇到了問題。 而不是0.3我得到0.2999999999999Visual Studio 2010 C#Double

當我調試一點點時,我已經看到轉換不是問題。

查看打印屏幕和我的觀察列表? http://i.imgur.com/rTUDfxo.png

有沒有想法?

編輯: 答案:這是Visual Studio 2010的一些奇怪的行爲。 重新啓動後,一切都很好。

+1

浮點值 – 2013-05-10 08:40:13

+2

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg。 html – 2013-05-10 08:42:02

+1

事實上,這個問題無法回答。 0.2999999999999與0.3的Double值一樣有效。沒有語境,沒有人能告訴你爲什麼你觀察的這些價值觀是「錯誤的」。 – 2013-05-10 08:42:06

回答

2

0.3當存儲二進制文件時有一個無限表示法:(0.) 00111111 11010011 00110011 00110011 00110011 00110011 00110011 00110011 .....無論是用32,64還是128位存儲它,它都會在某個時刻切斷。

當將其轉換爲雙精度時,將失去精度。這就是爲什麼你得到0.2999999999 ...

這不是一個錯誤,它是簡單的不可能存儲無限精度。

+0

這是Visual Studio 2010的一些奇怪的行爲。重新啓動後,一切都很好。 – 2013-05-10 09:00:43

+1

請注意此標準:http://en.wikipedia.org/wiki/IEEE_floating_point IEEE-754 – 2013-05-10 09:12:28

1

該行爲常見於雙倍行爲,因爲它是floating binary type。 這兩種類型保存的值在存儲器中完全不同的,例如:

在浮子,所述計算機保存這樣

10001.10010110011 

若干然而,在小數時,它存儲這樣

12345.65789 

這可能會導致數字差別很小,例如:

在浮動:

0.1 = 0.09999 

在十進制

0.l = 0.1