c#中Math.Round()函数的解析

Htojk 2017-10-12 03:32:06
Round的使用



举个例子如下:
using System;
namespace practice3
{
class MainClass
{
public static void Main(string[] args)
{
float a=10.1f;
float b=10.9f ;
float c = -10.1f;
float d = -10.9f;
Console.WriteLine(Math.Round(a,0));
Console.WriteLine(Math.Round(b,0));
Console.WriteLine(Math.Round(c,0));
Console.WriteLine(Math.Round(d,0));
}
}
}

这里定义了a,b,c,d四个浮点数,当使用Round函数操作之后,都分别变成了离这个数最接近的整数。但是,这里存在一个特例,也就是当小数点位为5的时候,可以测试看一组数据:
using System;
namespace practice3
{
class MainClass
{
public static void Main(string[] args)
{
float a=10.5f;
float b=11.5f ;
float c = -10.5f;
float d = -11.5f;
Console.WriteLine(Math.Round(a,0));
Console.WriteLine(Math.Round(b,0));
Console.WriteLine(Math.Round(c,0));
Console.WriteLine(Math.Round(d,0));
}
}
}

可以看出,这里的Round并非符合四舍五入的规律,也在此提醒各位初学者,不要把Round理解为四舍五入,那么Round到底是一个什么样的规律呢?
假如一个数为:a.5
1.当a为正数的时候:a如果为奇数,使用Round之后,则舍去5进位,即结果为:a+1。如:3.5——》4
a如果是偶数,使用Round之后,则直接舍去5,即结果为:a。如4.5——》4
2.当a为负数的时候:a如果是奇数,使用Round之后,则舍去5后退一位,也就是a-1;
如:-3.5——》-4;
a如果是偶数,使用Round之后,则直接舍去5,结果为a;
如:-4.5——》-4;
如果理解有错,请大神纠正。如果还有扩展性文档,也请大佬不吝赐教!当然,其详细用法请参考微软官方手册。
地址为:https://msdn.microsoft.com/zh-tw/library/3s2d3xkk(VS.80).aspx
...全文
4787 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
钟眞龙 2020-03-13
  • 打赏
  • 举报
回复
我看MSDN上面的说话,貌似还跟第一次Round有关。 比如, double v = 11.1; for(int count = 0; count <= 5; count++) { Console.WriteLine(Math.Round(v)); v = v + 0.1; } 这样做当执行到Math.Round(11.5)的时候,输出的却是11。并非12. 如果把v初始化为1.1或者2.1时。 最后一个值却是2或者3,进位1了
Htojk 2018-02-09
  • 打赏
  • 举报
回复
博文是我初学Mathf.Round()的时候发的,那时也就根据自己的多次测验得出的结论,当然也没有错误,就是描述的有些啰嗦。后来也是在网上学习,才知道了round的简洁规律和官方用词。Milo米啊米啊米和xdashenwan说的就挺好的
xdashewan 2017-10-12
  • 打赏
  • 举报
回复
framework4中可以注意备注有如下描述: 如果 d 中 decimals 小数位置右侧的第一位数字的值为 5,则 decimals 位置中的数字向上舍入(如果为奇数)或不变(如果为偶数)。 如果 d 的精度小于 decimals,则返回 d 而不做更改。 此方法的行为遵循 IEEE 标准 754 的第 4 节。 这种舍入有时称为就近舍入或四舍六入五成双。 它可以将因单方向持续舍入中点值而导致的舍入误差降到最低。 若要控制 Round(Decimal, Int32) 方法使用的舍入类型,请调用 Decimal.Round(Decimal, Int32, MidpointRounding) 重载。 framework4之前版本在返回值栏目中也有相似描述 如果要四舍五入,就要用Math.Round 方法 (Decimal, MidpointRounding)重载https://msdn.microsoft.com/zh-cn/library/ms131274(v=vs.100).aspx
正怒月神 2017-10-12
  • 打赏
  • 举报
回复
C#中的Math.Round()并不是使用的"四舍五入"法。其实在VB、VBScript、C#、J#、T-SQL中Round函数都是采用Banker's rounding(银行家算法),即:四舍六入五取偶。事实上这也是IEEE的规范,因此所有符合IEEE标准的语言都应该采用这样的算法。
  • 打赏
  • 举报
回复
关于Math.Round方法,它的舍入是根据MidpointRounding 枚举来的。该枚举有2个值ToEven和AwayFromZero。 ToEven 当一个数字是其他两个数字的中间值时,会将其舍入为最接近的偶数。 AwayFromZero 当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较小的值。 可以发现AwayFromZero就是我们常见的四舍五入,但是Math.Round方法方法默认用的舍入方式并不是AwayFromZero,而是ToEven。实际上ToEven应该更科学一些。 关于ToEven的舍入规则,可以这样理解:你要舍去的部分的第一个数组如果是0 到 4 的数字,则直接舍去;如果要舍去的部分第一个数字是6 到 9 ,那么就进1。这和四舍五入没有区别。有区别的地方是当要舍去的部分第一个数字为5的时候。因为5和前后两个数的绝对值差是一样的(比如1.5同1与2相差都是0.5),这样直接用四舍五入不太精确。 所以在ToEven的时候,如果要舍入的第一位数字是5,舍入得到的值是最接近的偶数。比如3.5得到的是5,2.5得到的是2。 ToEven是Math.Round方法默认的舍入方式,如果想用四舍五入,则需要设置舍入方式的参数为MidpointRounding.AwayFromZero。
cheng2005 2017-10-12
  • 打赏
  • 举报
回复
规则就是四舍六入啊

110,536

社区成员

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

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

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