C# Math.Round()的银行家算法
2023-09-11 14:14:13 时间
可能很多人都跟我一样,都只知道Math.Round()是C#中用来做四舍五入,保留指定小数位的
但实际上它并不是真正的四舍五入,而是银行家算法的四舍六入五取偶
事实上这也是IEEE的规范,因此所有符合IEEE标准的语言都应该采用这样的算法。
其规则如下:
1、当舍去位的数值小于5时。直接舍去
2、当舍去位的数值大于6时,进位加1
3、当舍去位的数值等于5时,分两种情况:
(1)若5后面有其他非0数字(即5不是最后一位)时,进位加1
(2)若5后面只有0(即5是最后一位)时,则根据5的前一位的奇偶来判断,前一位为奇数则进位加1,为偶数则舍去
遇到5需要舍去的情况只有一种,即5是最后一位有效数且前一位数是偶数
数字的精度越大,则这个算法就越像真正的四舍五入
我们使用这个函数时,用来处理的数字通常是那些有n位小数的数字,而我们用于显示的通常也就只有2-4位,所以这也就不容易发现这个问题
可能光是文字大家不好理解,下面写几个例子
Math.Round(1.14 , 1) //result:1.1 Math.Round(1.25 , 1) //result:1 .2 五是最后一位且前一位为 偶数,也舍去 Math.Round(1.15 , 1) //result:1 .2 五是最后一位但前一位为奇数,进位加一 Math.Round(1.16 , 1) //result:1 .2
.NET 2.0 开始,Math.Round 方法提供了一个枚举选项 MidpointRounding.AwayFromZero 可以用来实现传统意义上的"四舍五入"。
Math.Round(1.25 , 1) //result:1 .2 Math.Round(1.25 , 1, MidpointRounding.AwayFromZero) //result:1 .3
相关文章
- C#子线程中更新ui-----c# 多线程多文件批量下载
- C#如何把写好的类编译成dll文件
- C#.NET如何将cs文件编译成dll文件 exe文件 如何调用dll文件
- C#与Java同步加密解密DES算法
- 重新整理数据结构与算法(c#)——算法套路迪杰斯特拉算法[三十一]
- C# Java间进行RSA加密解密交互(三)
- 重新整理数据结构与算法(c#)——算法套马踏棋算法[三十三]
- 重新整理数据结构与算法(c#)—— 堆排序[二十一]
- c# Barrier 线程回调
- C# DataTable Copy() 与 Clone()区别
- C# 自定义数字格式字符串 ToString ###,###,###,##0
- 【原创】机器学习之PageRank算法应用与C#实现(2)球队排名应用与C#代码
- Atitit 项目语言的选择 java c#.net php??
- Atitit。D&D drag&drop拖拽功能c#.net java swing的对比与实现总结
- c# 将字符串转换为指定类型的值
- c#数据类型之值类型和引用类型
- (21)C# 访问Redis的测试
- CSharp(C#)语言_异常和异常处理
- c#中在一个窗体中触发另一个窗体的事件
- C# 获取当前方法的名称空间、类名和方法名称
- [转]C# 互操作性入门系列(三):平台调用中的数据封送处理
- C#常用的算法