的精度在C#如何解決變量
double tmp = 3.0 * 0.05;
TMP = 0.15000000000000002
這與錢有關。價值真的是0.15美元,但系統想要把它湊到0.16美元。 0.151應該四捨五入爲0.16,但不是0.15000000000000002
有什麼方法可以得到正確的數字(即0.15或0.16,如果小數足夠高)。
的精度在C#如何解決變量
double tmp = 3.0 * 0.05;
TMP = 0.15000000000000002
這與錢有關。價值真的是0.15美元,但系統想要把它湊到0.16美元。 0.151應該四捨五入爲0.16,但不是0.15000000000000002
有什麼方法可以得到正確的數字(即0.15或0.16,如果小數足夠高)。
使用一個定點變量類型或十進制等十個基本浮點類型。浮點數字總是有些不準確,而二進制浮點表示法在轉換爲/從第二個基準點時會增加另一個不準確的層次。
「小數」型是專門爲此設計的
在企業應用架構模式,Martin Fowler的建議使用貨幣抽象
http://martinfowler.com/eaaCatalog/money.html
晴,他會爲應對貨幣,但也精確。
你可以看到一個小的就在此谷歌圖書搜索結果:
錢應該被存儲爲decimal
,這是一個floating decimal point type。對於其他真正離散而非連續的數據也是如此,並且在邏輯上本質上是十進制的。
由於顯而易見的原因,人類對小數有偏見,因此「人造」數量(如貨幣)往往更適用於十進制形式。 「自然」數量(質量,高度)的尺度更加連續,這意味着float
/double
(它們是floating binary point types)通常(但不總是)更合適。
A decimal
數據類型將工作得很好,可能是您的選擇。
但是,在過去,我已經能夠使用定點整數以優化的方式做到這一點。它是高性能計算的理想選擇,其中decimal
已陷入癱瘓,您無法獲得float
的小精度錯誤。
以Int32
開頭,並分成兩半。前半部分是整數部分,後半部分是小數部分。你得到16位有符號整數加上16位小數精度。例如1.5作爲16:16定點將被表示爲0x00018000
。或者,改變位的分佈以適應您的需求。
像任何其他整數一樣,通常可以將定點數加起來/ sub/mul/div,在mul/div周圍工作一點點以避免溢出。
十進制是一個浮點型了。這只是一個浮點*十進制*點。 – 2008-10-07 16:46:20
很高興知道。希望編輯更精確一些。 – AaronSieb 2008-10-07 17:04:35