2013-02-15 139 views
0

假設我有三個雙打,a,b和c。四捨五入操作

double a = 1.234560123; 
double b = 7.890120123; 

double c = a * b; 

c = 9.740827669535655129 

我想使用只有5位小數的數字。所以,如果我圓a和b使用Math.Round(一,5)和Math.Round(B,5)我得到:

double a_r = Math.Round(a, 5); 
double b_r = Math.Round(b, 5); 

a_r = 1.23456 
b_r = 7.89012 

double c_r = a_r * b_r; 

c_r = 9.7408265472 

但是當我計算C,我還是得到了一些有超過5小數位(這將發生在每次乘法,除法,增強和類似操作中)。我可以將所有結果放在我的代碼中,但這是我想避免的難題。

由於我在其他操作中使用c和其他操作的結果,所以我不希望每次都舍入所有中間結果,以免傳播由不需要的小數位引起的錯誤。

有沒有辦法用固定的小數位數來定義雙精度,與運算無關?

+1

裏德給下面你的答案通過谷歌搜索:) – Brian 2013-02-15 16:58:46

+1

你爲什麼要限制你的準確度一樣,很容易被發現的?只想顯示一定數量的小數位是很常見的,但我想不出有什麼理由來人爲限制計算中使用的小數位數。 – anaximander 2013-02-15 17:02:31

+0

@anaximander這是特別真實的,因爲他使用的精度比那個更高... – 2013-02-15 17:04:04

回答

-1

我找到了一種方法來解決我的問題,使用運算符重載。

所以我重新定義了我所有的操作:乘法,除法,複數乘法和矩陣運算,將結果四捨五入到我想要的小數位數。

一個例子:

public static double operator *(double d1, double d2) 
{ 
    double result; 
    result = Math.Round(d1 * d2, 5); 

    return result; 
} 
4

通常情況下,這是最好的留在雙打到位,使用自定義格式顯示值5個小數點:

double a = 1.234560123; 
double b = 7.890120123; 

double c = a * b; 

Console.WriteLine("Result = {0:N5}", c); 

幾乎是轉換數值轉換爲字符串的所有程序允許使用的Standard Numeric Format Strings以及Custom Numeric Format Strings

+0

問題是我用c來製作其他人和其他人的操作,我不想傳播由不太重要的小數位引起的結果差異。 我不想做一輪或類似的東西,永遠得到我的中間結果。 – 2013-02-15 17:05:22

+0

@GuilhermeCampos你可以倒圓角,但雙精度很少精確。最好保持原來的精度,然後在最後格式化輸出。有關詳細信息,請參閱:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – 2013-02-15 17:11:16