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);
}
}
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);
}
}
相关文章推荐
- C#中Math.Round()实现中国式四舍五入
- C# 中的四舍五入算法及 MSDN 2005 中文版 Math.Round 勘误
- C#中Math.Round()实现中国式四舍五入
- C#中Math.Round()实现中国式四舍五入
- C#练习记录(请计算出一个整型数组的平均值。{ 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 }。要求:计算结果如果有小数,则显示小数点后两位(四舍五入)。Math.Round())
- WinCE的C#编程,对float型进行四舍五入保留两位小数,小数进行四舍五入操作,Math.Round的应用案例。
- C#中Math.Round()实现中国式四舍五入
- C#使用Math.Round()四舍五入
- C# 中的四舍五入算法及 MSDN 2005 中文版 Math.Round 勘误 .
- C#中Math.Round()实现中国式四舍五入
- C#中Math.Round()实现中国式四舍五入
- C#中Math.Round()实现中国式四舍五入
- C#中Math.Round()实现中国式四舍五入
- C#中Math.Round()实现中国式四舍五入
- C#中Math.Round()实现中国式四舍五入
- Math.Round是四舍五入还是五舍六入
- Math.Round是四舍五入还是五舍六入
- C#里Math.Round()函数问题
- Math.Round 之关于 不同的四舍五入
- JavaSE8基础 Math.round 简单的四舍五入成整数