2011-04-08 87 views
3
Math.Round(keyRate, 5).ToString("N5") 

如果keyRate像3.7066666666一個數字,你會看到3.70666而不是3.70667不正確四捨五入

這可能是什麼問題嗎?

+0

有趣......根據http://msdn.microsoft.com/en-us/library/zy06z30k.aspx,它應該工作不這樣工作。 – bdares 2011-04-08 02:00:51

+4

'keyRate'是什麼類型?我剛剛用'float','double'和'decimal'來測試你的代碼,並且它們都產生了3.70667。 – LukeH 2011-04-08 02:02:54

+0

嗯...你得到了3.70666嗎? – 2011-04-08 02:03:49

回答

4

默認情況下,Math.Round函數使用所謂的銀行家舍入。銀行家對偶數進行四捨五入。爲了獲得更多的傳統舍入類型的,叫Round方法是這樣的:

Math.Round(3.7066666666, 5, MidpointRounding.AwayFromZero); 

修正:在@ slandau的號碼再次找我意識到銀行家舍是不是這裏的問題後。銀行家的舍入僅適用於數字的小數部分在所需精度的右側恰好在兩個值之間的中途。換句話說

Math.Round(3.7066650000, 5, MidpointRounding.AwayFromZero) = 3.70667 

而以下(銀行家的舍入)

Math.Round(3.7066650000, 5, MidpointRounding.ToEven) = 3.70666 

@ slandau的結果應該是3.70667兩種方式。

+0

所以* 3.70666 *是偶數,而* 3.70667 *是奇數? – 2011-04-08 02:27:14

+0

最後的6是偶數。如果你四捨五入到整數,它將舍入到4.見http://en.wikipedia.org/wiki/Rounding#Round_half_to_even – 2011-04-08 02:30:40

+0

我認爲* even *和* odd *是整數的修飾符。 – 2011-04-08 02:32:12

-1

您應該使用十進制和Math.Round(keyRate, 5, MidpointRounding.AwayFromZero)
它不與雙

+0

爲什麼downvote? – 2012-10-20 22:56:09