C# 中的四舍五入函数及 Math.Round 勘误

vrhero 2007-03-02 03:03:34
看到一个帖子《ASP.net中c#里有没有四舍五入函数? 3.4进行四舍五入的计算在c#里如何实现?》
http://community.csdn.net/Expert/TopicView3.asp?id=5371508

关于四舍五入的讨论和对 Round 函数的误解网上有很多,我在CSDN的第一帖就来说说这个简单问题,欢迎大家拍砖,呵呵

C# 中没有四舍五入函数,事实上我知道的程序语言都没有四舍五入函数,因为四舍五入算法不科学,国际通行的是 Banker 舍入法

Banker's rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都应该是采用这一算法的

Math.Round 方法默认的也是 Banker 舍入法

在 .NET 2.0 中 Math.Round 方法有几个重载方法
Math.Round(Decimal, MidpointRounding)
Math.Round(Double, MidpointRounding)
Math.Round(Decimal, Int32, MidpointRounding)
Math.Round(Double, Int32, MidpointRounding)

将小数值舍入到指定精度。MidpointRounding 参数,指定当一个值正好处于另两个数中间时如何舍入这个值

该参数是个 MidpointRounding 枚举

此枚举有两个成员,MSDN 中的说明是:
AwayFromZero 当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较小的值。
ToEven 当一个数字是其他两个数字的中间值时,会将其舍入为最接近的偶数。

注意!这里关于 MidpointRounding.AwayFromZero 的说明是错误的!实际舍入为两个值中绝对值较大的值。不过 MSDN 中的例子是正确的,英文描述原文是 it is rounded toward the nearest number that is away from zero.

所以,要实现四舍五入函数,对于正数,可以加一个 MidpointRounding.AwayFromZero 参数指定当一个数字是其他两个数字的中间值时其舍入为两个值中绝对值较大的值,例:

Math.Round(3.45, 2, MidpointRounding.AwayFromZero)

不过对于负数上面的方法就又不对了

因此需要自己写个函数来处理

double ChinaRound(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);
}
}
...全文
8857 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 selonteng 的回复:]

引用 15 楼 vrhero 的回复:
请注意,此帖是三年前的...文中描述的问题已经得到修补,请不要再用那段示例代码... 直接用下面这个即可...

C# code
return Math.Round(value, decimals, MidpointRounding.AwayFromZero);


上面的也不是绝对,试试下面的
----------------------……
[/Quote]
我测试了一下没错,结果为2.4445
SupremeHover 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 selonteng 的回复:]

引用 15 楼 vrhero 的回复:
请注意,此帖是三年前的...文中描述的问题已经得到修补,请不要再用那段示例代码... 直接用下面这个即可...

C# code
return Math.Round(value, decimals, MidpointRounding.AwayFromZero);


上面的也不是绝对,试试下面的
----------------------……
[/Quote]

还真是这样,我对MATH.ROUND有点糊涂了……
selonteng 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 vrhero 的回复:]
请注意,此帖是三年前的...文中描述的问题已经得到修补,请不要再用那段示例代码... 直接用下面这个即可...

C# code
return Math.Round(value, decimals, MidpointRounding.AwayFromZero);
[/Quote]

上面的也不是绝对,试试下面的
------------------------------------
Math.Round(2.44445, 4, MidpointRounding.AwayFromZero);
------
结果:2.4444
billyhe07 2010-05-31
  • 打赏
  • 举报
回复
学习。。
biao15814 2010-05-29
  • 打赏
  • 举报
回复
楼上的 你自己怎么不用脑子啊
x=-0.5 你就不知道减0.5吗 x = int(x - 0.5)

你这么死板 怎么做开发啊
vrhero 2009-03-05
  • 打赏
  • 举报
回复
请注意,此帖是三年前的...文中描述的问题已经得到修补,请不要再用那段示例代码...

直接用下面这个即可...

return Math.Round(value, decimals, MidpointRounding.AwayFromZero);
Comer 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zswang 的回复:]
老外的Round并不是四舍五入的意思

这样就可以四舍五入了

x   =   int(x   +   0.5)
[/Quote]

x=-0.5如何?

怎么这么多人不用脑子瞎附和啊。。。
Comer 2009-03-05
  • 打赏
  • 举报
回复
-0.44449,保留2位小数应该是-0.44还是-0.45???

楼主的函数得到的答案是-0.44
wcz1228 2008-10-31
  • 打赏
  • 举报
回复
好!
jxjjljf 2007-05-18
  • 打赏
  • 举报
回复
vrhero 2007-03-02
  • 打赏
  • 举报
回复
to hbxtlhx(平民百姓)
说的再简单些再通俗些就好了.
---------------------
这个...我觉得够简单了吧,呵呵

to zswang(伴水清清)
x = int(x + 0.5)
-------------------
没错,我也常用这种方法,还有很多方法可以实现

如 WeiWY(大海) 说的
double.Parse(d.ToString("0.0"));

我只所以用个麻烦的例子,目的是想解释下 Math.Round 的用法
j9988 2007-03-02
  • 打赏
  • 举报
回复
四舍六入,逢五奇进偶舍.
没错.一般比较精确的取舍进位都用这个.
liujia_0421 2007-03-02
  • 打赏
  • 举报
回复
嗯,不错...
hertcloud 2007-03-02
  • 打赏
  • 举报
回复
x = int(x + 0.5)

这个不错.
王集鹄 2007-03-02
  • 打赏
  • 举报
回复
老外的Round并不是四舍五入的意思

这样就可以四舍五入了

x = int(x + 0.5)
chenz322556 2007-03-02
  • 打赏
  • 举报
回复
mark
北京的雾霾天 2007-03-02
  • 打赏
  • 举报
回复
说的再简单些再通俗些就好了.
csShooter 2007-03-02
  • 打赏
  • 举报
回复
楼主是好人啊
csShooter 2007-03-02
  • 打赏
  • 举报
回复
mark

110,477

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧