有人可以向我解釋爲什麼Math.Round(1.565,2) = 1.56
而不是1.57
?Math.Round數字,3位小數
回答
參見:Math.Round Method (Double, Int32)
由於損失的精度,可能導致從代表 十進制值作爲浮點數或浮點值進行算術 操作,在某些情況下,圓形的(Double, Int32)方法可能不會出現將中點值舍入到最接近的 偶數值的小數點位置。這在以下示例中的 中進行了說明,其中2.135被舍入爲2.13而不是2.14。 發生這種情況的原因是內部方法會將值乘以10位數,並且在這種情況下乘法運算會遇到 丟失的精度。
而且例子是:
public static void Main()
{
double[] values = { 2.125, 2.135, 2.145, 3.125, 3.135, 3.145 };
foreach (double value in values)
Console.WriteLine("{0} --> {1}", value, Math.Round(value, 2));
}
1.565的double
表示不準確,並且略微小於該數量 - 1.56499999999999994670929481799249960965709294817992486059665679931640625或其附近。所以當四捨五入到小數點後兩位時,它會向下舍入。
即使你使用decimal
(代表小數完全一致),並嘗試Math.round(1.565M,2)
,這也將得到四捨五入,如Math.round(number, decimalPlaces)
回合值一個值和未來走向最後的數字是連一個之間的中途 - 這有時稱爲banker's rounding。例如,Math.round(1.575M,2)
將向上舍入。
Math.Round()
使用銀行家舍入算法。基本上它將任何以5結尾的數字向偶數進行舍入。所以1.565向下(朝向6),但向1.575朝上(朝向8)。如果添加許多舍入的數字,這可以避免積累的舍入誤差。
發生這種情況是因爲內部方法會將值乘以10位,並且在這種情況下乘法操作會遭受精度損失。 http://msdn.microsoft.com/en-us/library/system.math.round.aspx#Round5_Example和 http://msdn.microsoft.com/en-us/library/75ks3aby.aspx
- 1. Math.Round,保留小數位
- 2. math.round數字格式
- 3. PI小數使用Math.Round
- 4. 將9位數字轉換爲3位3位數字
- 5. 帶3位小數的HTML.EditorFor
- 6. Math.round()來控制小數位不起作用
- 7. 的JavaScript Math.round:犯規圓形物體到1位小數
- 8. 顯示小數點後最多顯示3位數的數字
- 9. Math.round(Math.random)返回3個唯一數字問題
- 10. SQL從小數點後3位舍入到2位小數
- 11. Javascript - 格式數爲3位小數
- 12. 更新VARCHAR字段,使數內場是3位小數
- 13. ExtJS數字格式。小數點後3位
- 14. 將小數點後兩位數舍入到3位小數點,但在小數點後三位消失0
- 15. 小數位數的小數位數
- 16. Math.Round方法,從最小的小數開始
- 17. 在Python中使用3位小數
- 18. 格式cctime,小數點後3位
- 19. 版本比較器3位小數
- 20. 如何截斷3號位小數
- 21. javascript中的3個小數位
- 22. 允許輸入小數位至3
- 23. GWT - 超過3小數位的DoubleBox
- 24. 如何把一個數字與10位小數只是逗號後3位小數
- 25. VBA中2位數字大於3位數字的問題
- 26. textbox允許帶一位小數的數字和小數點後的一位數
- 27. PCL中的Math.Round函數
- 28. 在小數點後打印PHP浮點數3位數?
- 29. 將數字舍入到小數位
- 30. 小數點後只有2位數字?
在這裏看到:http://stackoverflow.com/questions/977796/why-does-math-round2-5-return-2-instead-of-3-in-c –
你能否詳細說明這兩種語言在這裏如何應用? –
'Math.Round(1.565,2,MidpointRounding.AwayFromZero)'會給你'1.57' –