2010-09-29 47 views
2

我遇到了常見數學運算中的雙精度不精確問題。這是一個簡單的添加將追加00000000x我的雙。處理雙精度除了使用小數而不精確

我從another question讀取應該使用小數代替。

但我使用這個應用程序是統計相關的,性能是一個問題。我從某個地方看到,長遠來說,小數會大大降低性能。

是否有任何合理的替代方法/方法可以避免不精確而不使用Decimal數據類型?

+0

何時有統計數據? – leppie 2010-09-29 03:38:37

+0

實際上,我只需要最多4位小數位,但由於存在這些不均勻性,我在繪製某些元素時遇到了一些麻煩。 – Jonn 2010-09-29 04:19:31

+1

我不認爲你可以做一些事情,而不是使用十進制代替。也許如果你解釋你遇到的渲染問題,我們可以找到解決方案。 – 2010-10-07 12:14:07

回答

1

當您在完成所有計算後最終顯示或存儲結果爲字符串時,舍入到所需的小數位數。

例如,使用下面的四個小數位:

double d = ___; 
string s = String.Format(
    System.Globalization.CultureInfo.InvariantCulture, 
    "{0:0.0000}", d); 
Console.WriteLine(s); 

請注意,這並不意味着你會得到相同的結果,如果你用鉛筆和紙做的,或者用手持式計算器,或無限精度的數學。也不意味着顯示的結果是正確的+/- 0.00005(對於上面的例子):可以從中間計算中累積近似誤差。

下面介紹如何完成類似的東西用科學記數法:

string s = String.Format(System.Globalization.CultureInfo.InvariantCulture, 
    "{0:0.0000E0}", d); 

有關自定義數字格式字符串的更多信息,請參見http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

如果你不感興趣,實際上顯示或存儲的值作爲一個字符串,另一種方法是轉換到Decimal和輪double執行性能關鍵的計算之後:

Decimal dec = Decimal.Round((Decimal)d, 4); 

注意,當確切與鉛筆和紙張方法的對應是必需的,因爲沒有基10到基2的轉換以及與這種基轉換相關的相應的近似誤差,您應該在計算的所有步驟中使用Decimal。這就是說,Decimal不是無限的精確度:儘管對於最常見的用例(例如,多種財務計算)Decimal將會「正常工作」,但仍然會遇到近似誤差。