您的位置:首页 > 编程语言 > C#

c#Math.Round最準確的四舍五入

2011-10-14 10:16 253 查看
1、算法
Math.Round 采用的是:
"四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍去,五前为奇要进一"

問題:
在VS2005中 即时窗口下运行结果如下
Math.Round(1.435,2)
1.44
Math.Round(2.435,2)
2.44
Math.Round(5.435,2)
5.44
Math.Round(4.435,2)
4.43

Math.Round 采用的是:
"四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍去,五前为奇要进一"
但是为什么Math.Round(4.435,2)结果是4.43
其他的都是x.44

回答:
都说了是精度的问题了
你试试
Math.Round(new decimal(4.435),2)
輸出:4.44

所以,最好是用必須是decimal類型

2、解決方法
Math.Round()准确的说,这个函数不是四舍五入,而是四舍六入五凑偶,就是说小于4或大于6的该舍该入是没有争议的,而5处在正中间,如果四舍五入则会造成数据的整体偏差,所以采取的原则是:如果舍入位为5,则舍入后最后一位为偶数,这是国际惯例。
现在做的项目都要5入,解决方法:
目前做法是:
(1)數字轉換成decimal類型
(2)使用MidpointRounding.AwayFromZero
例如:
Math.Round(new decimal(4.4450), 2, MidpointRounding.AwayFromZero);
4.45
Math.Round(new decimal(-4.4450), 2, MidpointRounding.AwayFromZero);
-4.45
Math.Round(new decimal(4.4450), 2);
4.44

Math.Round(4.4350, 2, MidpointRounding.AwayFromZero);
4.43(3)負數時解決:

目前做法是:
如:(3.45*10+0.5)取整,再除以10

/// <summary>
/// 计算四舍五入
/// </summary>
/// <param name="value">值</param>
/// <param name="decimals">截取位数</param>
/// <returns></returns>
public static double Round(double value, int decimals)
{
if (value < 0)
{
return Math.Round(value + 5 / Math.Pow(10, decimals + 1), decimals, MidpointRounding.AwayFromZero);
}
else
{
return Math.Round(value, decimals, MidpointRounding.AwayFromZero);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: