相信细心的程序员们早就发现了.net环境下默认舍入算法的是“四舍六入”的算法。从小学我们就学过“四舍五入”算法,但是更加科学的舍入办法应该是“四舍六入”,也就是今天我们要讨论的“银行家舍入”。

大家可以做一个Demo。

C#环境下

   1:  class Program
   2:      {
   3:          static  void Main(string[] args)
   4:          { 
   5:             do
   6:             {
   7:                  Console.WriteLine("请输入一个小数回车测试,输入其他回车结束测试");
   8:                  string Num = Console.ReadLine();
   9:                  try
  10:                  {
  11:                      Console.WriteLine("结果为" + Convert.ToInt16(Convert.ToDouble(Num)));
  12:                  }
  13:                  catch (Exception e) {
  14:                      break;
  15:                  } 
  16:             }
  17:             while (true );
  18:          }
  19:      }

得到的结果如下

<style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style>

VB.net环境下测试代码为

   1:      Sub Main()
   2:          Do
   3:              Console.WriteLine("请输入一个小数回车测试,输入其他回车结束测试。")
   4:              Try
   5:                  Dim a As String = Console.ReadLine()
   6:                  Console.WriteLine("结果为:" & CInt(Convert.ToDouble(a)))
   7:              Catch ex As Exception
   8:                  Exit Sub
   9:              End Try
  10:          Loop
  11:      End Sub

结果如下

完全符合银行家舍入的规律:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一

关于VB.net中的CInt微软的MSDN上有具体说明

Fractional Parts. When you convert a nonintegral value to an integral type, the integer conversion functions ( CByte, CInt, CLng, CSByte, CShort, CUInt, CULng, and CUShort) remove the fractional part and round the value to the closest integer.

If the fractional part is exactly 0.5, the integer conversion functions round it to the nearest even integer. For example, 0.5 rounds to 0, and 1.5 and 2.5 both round to 2. This is sometimes called banker's rounding, and its purpose is to compensate for a bias that could accumulate when adding many such numbers together.

相对于四舍五入,银行家舍入的确更加的准确,讨论如下:

有些童鞋可能认为在一般性的测量中,最后一位小数位上0至9出现的概率是相等的。一共十个数字,0至4可以舍去(四舍),5至9可以进位(五入),多么完美的舍入算法!

但是!您可能忽略了一点,末尾的0在这里是相当于10还是相当于0?

为了避免混沌,请看下图:

<style type="text/css"> <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consolas,"Courier New",courier,monospace; background-color:#ffffff} .csharpcode pre {margin:0em} .csharpcode .rem {color:#008000} .csharpcode .kwrd {color:#0000ff} .csharpcode .str {color:#006080} .csharpcode .op {color:#0000c0} .csharpcode .preproc {color:#cc6633} .csharpcode .asp {background-color:#ffff00} .csharpcode .html {color:#800000} .csharpcode .attr {color:#ff0000} .csharpcode .alt {background-color:#f4f4f4; width:100%; margin:0em} .csharpcode .lnum {color:#606060} --> </style>

图中是用Matlab画的一个简单的数轴,可以看出0.0、0.1、0.2、0.3、0.4、0.5、0.6、0.7、0.8、0.9、1.0中0.0和1.0都是0结尾所以不能确定测量数据中的0是哪个零!

还是看上图,图中只要不满0.5都按照0算,大于0.5都按照1.0算,那么剩下的0.5怎么办?为了体现平均性,看上一位是奇数还是偶数,如果是奇数则进位,如果是偶数则舍去。这正是“银行家舍入”的思想。这样一来便达到了相对于“四舍五入”舍入方法更加平衡的舍入算法。

PS:“银行家舍入”是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都是采用这一算法的。

四舍五入VS银行家舍入相关推荐

  1. 四舍五入VS银行家舍入 (四舍六入五取偶)

    相信细心的程序员们早就发现了.net环境下默认舍入算法的是"四舍六入"的算法.从小学我们就学过"四舍五入"算法,但是更加科学的舍入办法应该是"四舍六入 ...

  2. 四舍五入和银行家舍入法

    四舍五入是一种应用非常广泛的近似计算方法,其有算术舍入法和银行家舍入法两种. 所谓算术舍入法,就是我们通常意义上的四舍五入法.其规则是:当舍去位的数值大于等于5时,在舍去该位的同时向前位进一:当舍去位 ...

  3. MySql数据类型分析(银行家舍入法) Part3

    四舍五入和银行家舍入法 一.四舍五入是一种应用非常广泛的近似计算方法,其有算术舍入法和银行家舍入法两种. 所谓算术舍入法,就是我们通常意义上的四舍五入法.其规则是:当舍去位的数值大于等于5时,在舍去该 ...

  4. 银行家舍入VS四舍五入(下):.NET发现之旅(四)

    接上节 这一节继续讨论银行家舍入和四舍五入 三,自己动手开发四舍五入组件<?xml:namespace prefix = o ns = "urn:schemas-microsoft-c ...

  5. 用计算机四舍五入偷银行储户的钱,银行家舍入VS四舍五入(下):.NET发现之旅(四)...

    昨天和IBM以前培训的一个学员聊天,他问我.NET Framework提供四舍五***的方法了吗?我当时解释了老半天,索性就直接写一篇博文吧,以后学生问起,直接发文章看. ×××运算中的四舍五***法 ...

  6. Excel-VBA:“银行家舍入” 与“国际标准的四舍五入”

    Excel-VBA:"银行家舍入" 与"国际标准的四舍五入" 银行家舍入 国际标准的四舍五入 Excel里的 Round函数 银行家舍入 银行家舍入法就是大家所 ...

  7. python怎么使用int四舍五入_python浮点数舍入(ROUND)方式总结

    Round的英文含义,就有舍入的意思,最典型的就对浮点数的四舍五入.其实,存在多种round方式,本文总结python支持的浮点数的各种舍入方式. ROUND DOWN ROUND DOWN的含义是, ...

  8. 银行家舍入-四舍六入五成双

    在js的计算中: 一个例子,比如说一件商品,它的含税单价是450,税率是3%,那么我们将它转为不含税单价.450/1.03=436.8932038834951 结果是17位,共13位小数.当然实际上, ...

  9. 银行家舍入法(四舍六入)

    文章目录 银行家舍入法: 银行家舍入法: 生活中常见的计算方法就是四舍五入,但是银行家舍入法是四舍六入.五后面有非0的数字将直接向前进位,没有数字的情况下还要看前一位是偶数还是奇数.偶数舍去,奇数进位 ...

最新文章

  1. Red Hat Enterprise Linux 8.0 正式版镜像下载
  2. app 应用商店系统php,GitHub - ChhXin/appstore-admin: 基于ThinkPHP的应用商店后台管理系统...
  3. *【 POJ - 1007 】DNA Sorting(枚举,类似三元组找第二元问题)
  4. raft协议中统计一条log被多少节点复制
  5. 创建新DB和新用户DBeaver连接
  6. UVa 297 四分树
  7. 使用vue开发一个双向展开的卷轴组件
  8. 数据仓库入门(实验6)添加层次结构
  9. angularjs跨页面传参遇到的一些问题
  10. 书法的艺术 —— 大家的作品
  11. 【Day 1】机器阅读理解——机器阅读理解简介
  12. 7. 敏捷软件开发框架 - 极限编程XP
  13. 集合论中关系矩阵的布尔乘法运算与优化
  14. centos检测不到磁盘_IBM服务器安装CentOS找不到硬盘的解决方法
  15. Halo CMS项目改成用Maven构建项目并打包成安装程序
  16. python re 正则提取中文
  17. SEPIC 单端初级电感转换器 稳压器 -- Zeta 转换器
  18. HTML5面试题总结
  19. Vmware黑屏解决
  20. mysqldump 备份详解

热门文章

  1. 使用servlet提供接口
  2. 【BZOJ 4399】魔法少女LJJ
  3. Kaggle课程 — 机器学习进阶 Intermediate Machine Learning
  4. iOS Gif动画播放
  5. 数据治理-数据质量-数据质量的概念和维度
  6. 南加大和纽约大学计算机专业,NYU,南加大RD狂放榜?科比女儿喜提Offer大满贯!...
  7. kelvin模型蠕变方程_岩石力学复习资料
  8. Git的基本使用方法教程(入门级)
  9. 【读书笔记】AUTOSAR规范与车用控制器软件开发02
  10. 对话以太坊研究员 Polynya:为什么 L2 是未来?