2016-05-31 40 views
-1

這裏是我想要做的事:C#Math.Round很長的雙 - 不工作

double result = Math.Pow((1 + 8), 60) - 1; 

而結果變量是: 1.7970102999144311E + 57

,並試圖於:

Math.Round(result, 5); 

返回相同的:1.7970102999144311E + 57雙 我想將它四捨五入到1.79701例如

任何解決方案?

+2

將數字舍入爲一個整數。你想要我們的重要人物,而不是四捨五入。 –

+0

@WaiHaLee如果您在不傳遞數字的情況下使用重載'Math.Round(value)''',Math.Round'只能四捨五入爲整數。否則,它肯定*不會*整數 - 整數到指定的位數。 – Rob

回答

1

您誤解了您所看到的內容。

1.7970102999144311E+57 

是對

1797010299914431100000... (with 41 trailing zeros). 

這是一個整數科學記數法,因此四捨五入到5位小數將正確返回相同的值。

你想要做的是什麼格式返回1.79701E+57數量

String.Format(CultureInfo.InvariantCulture, "{0:0.#####E+0}", result); 

的輸出。請注意,這是一個1.79701不同的數字

+1

我想我對這個科學符號不是很熟悉,在第一個時刻它將我看作是一個十進制數字,但是當我再次查看這個數字時,你似乎是正確的。現在對我來說很清楚,我知道接下來需要做的是什麼,謝謝。 –

1

您遇到的問題是Math.Round將小數點右側的內容舍入。例如,如果你正在處理的貨幣,你執行你留下$ 1.5234524的操作,您可以使用:

Math.Round(1.5234524,2); 
// output 1.52 

你處理的數量實際上是科學記數法的一個非常大的數字有沒有什麼小數點的權利。這就是Math.Round的結果與輸入相同的原因。

0

較早的評論和答案是正確的。但要獲得您正在嘗試實現的內容,您可以使用以下內容:

double result = Math.Pow((1 + 8), 60) - 1; 
string s = String.Format("{0:E5}", result); 
double d = Double.Parse(s); 
+0

結果仍然是:1.79701E + 57!?任何想法如何擺脫這種無用(在我的情況下)科學記數法? –

+0

'string s = String.Format(「{0:E5}」,result).Substring(0,7);' –

+0

有點「骯髒」的解決方法,但仍然有效,謝謝@Clay Ver Valen –