2010-03-27 40 views
2

今天我在C#中遇到了一個奇怪的問題。我有一個ASP.NET頁面,用戶可以在其中輸入特定的價格,數量等。我得到價格值,將其轉換爲double,然後將其乘以100,然後將其轉換爲整數。當價格是「33.30」,在將其轉換爲雙倍之後,它仍然是33.3(顯然是......),但是在與100相乘之後,它變成3329.9999999999995,並且當我通過應用簡單的投射運算符「(int) (價格* 100)「,它變成3329.C#:數字轉換問題

現在我不知道爲什麼會發生這種情況。所以我想可能你們可以幫忙:)。

回答

10

這是因爲doubles are stored的方式。使用金錢處理時,您應該使用decimal以避免舍入錯誤。

+1

+1精確地:-) – Steffen

2

如果要將其轉換爲最接近的整數,則此方法有Math.Round方法。

您在默認情況下所做的是flooring - 這正是您所觀察到的。 (並與C一致)

+0

但我想知道爲什麼33.3乘以100產生3329.9999999999995。任何想法 ?關於這個問題,我已經使用「Convert」類的方法解決了它:) –

5

這是由於浮點舍入錯誤而發生的。浮點數不能用二進制精確表示,因此舍入錯誤(例如發生的錯誤)會發生。有關更多詳細信息,請參見this維基百科文章。

爲了克服這個問題,你應該舍入到最接近的整數 - 這最好通過使用Math.Round來實現。

但是在處理貨幣時,最好使用decimal而不是double

2

這個錯誤是因爲雙打都以二進制形式存儲。儘管每個二進制小數具有精確的十進制擴展,但大多數小數不具有精確的二進制擴展。十進制33.3有一個不精確的二進制擴展。這個近似值然後乘以100,並轉換成精確的十進制擴展,即3329.9999999999995。 (其實,這可能不是確切的擴展,由於顯示截斷,但它的要點是相同的。)