2008-10-07 76 views
3

的精度在C#如何解決變量

double tmp = 3.0 * 0.05; 

TMP = 0.15000000000000002

這與錢有關。價值真的是0.15美元,但系統想要把它湊到0.16美元。 0.151應該四捨五入爲0.16,但不是0.15000000000000002

有什麼方法可以得到正確的數字(即0.15或0.16,如果小數足夠高)。

回答

14

使用一個定點變量類型或十進制等十個基本浮點類型。浮點數字總是有些不準確,而二進制浮點表示法在轉換爲/從第二個基準點時會增加另一個不準確的層次。

+0

十進制是一個浮點型了。這只是一個浮點*十進制*點。 – 2008-10-07 16:46:20

+0

很高興知道。希望編輯更精確一些。 – AaronSieb 2008-10-07 17:04:35

0

「小數」型是專門爲此設計的

5

錢應該被存儲爲decimal,這是一個floating decimal point type。對於其他真正離散而非連續的數據也是如此,並且在邏輯上本質上是十進制的。

由於顯而易見的原因,人類對小數有偏見,因此「人造」數量(如貨幣)往往更適用於十進制形式。 「自然」數量(質量,高度)的尺度更加連續,這意味着float/double(它們是floating binary point types)通常(但不總是)更合適。

0

A decimal數據類型將工作得很好,可能是您的選擇。

但是,在過去,我已經能夠使用定點整數以優化的方式做到這一點。它是高性能計算的理想選擇,其中decimal已陷入癱瘓,您無法獲得float的小精度錯誤。

Int32開頭,並分成兩半。前半部分是整數部分,後半部分是小數部分。你得到16位有符號整數加上16位小數精度。例如1.5作爲16:16定點將被表示爲0x00018000。或者,改變位的分佈以適應您的需求。

像任何其他整數一樣,通常可以將定點數加起來/ sub/mul/div,在mul/div周圍工作一點點以避免溢出。

相關問題