`
java-mans
  • 浏览: 11392538 次
文章分类
社区版块
存档分类
最新评论

四舍五入VS银行家舍入

 
阅读更多

相信细心的程序员们早就发现了.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>

image

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

结果如下

image

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

关于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.

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

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

但是!您可能忽略了一点,末尾的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>

image

图中是用Matlab画的一个简单的数轴,可以看出0.00.10.20.30.40.50.60.70.80.91.00.01.0都是0结尾所以不能确定测量数据中的0是哪个零!

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

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

分享到:
评论

相关推荐

    升级版四舍五入可以自定义保留小数位

    不同于银行家算法,真正做到四舍五入,符合中国人的使用习惯,并且可自定义保留小数的位数。并且能够对参数值做错误判断。

    Math.Round四舍五入算法

    c#中Math.Round四舍五入算法:银行家舍入 四舍五入

    四舍六入五成双算法

    四舍六入五成双,又名银行家算法,是欧洲银行普遍采取的办法,比“四舍五入”更为精确,本文档主要阐述: 1、算法的概念 2、为何该算法更为精确 3、如何在c#中使用

    Delphi 四舍五入

    用于解决Delphi四舍五入的银行家算法。得出结果为四舍五入而不是四舍六入,奇进偶不进。

    c#中的浮点型转整形的舍取 四舍五入和银行家舍入实现代码

    c#中的浮点型转整形的舍取 四舍五入和银行家舍入实现代码,学习c#的朋友可以参考下

    C#四舍五入用法实例

    Bankers rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都应该是采用这一算法的。 Math.Round 方法默认的也是 Banker 舍入法 在 .NET 2.0 中 Math...

    delphi标准四舍五入法

    用ROUND不能实现我们日常意义的四舍五入,round是一种银行家的算法,四舍六入,五看寄偶。与我们日常习惯不一样。

    JS用最简单的方法实现四舍五入

    但是其四舍五入的规则与数学中的规则不同,使用的是银行家舍入规则,银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。具体规则如下: 简单来说就是:四舍六入五考虑,五后非零就...

    C#使用round函数四舍五入的方法

    C#中的round函数实际上不是真正的四舍五入函数,一般的程序设计语言的round函数也都不是四舍五入函数,而是银行家舍入法函数,也就是“四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要...

    MySQL中ROUND函数进行四舍五入操作陷阱分析

    主要介绍了MySQL中ROUND函数进行四舍五入操作陷阱,结合实例形式分析了mysql使用ROUND函数进行四舍五入运算中出现的问题及其错误原因,需要的朋友可以参考下

    “银行家算法”大揭秘!在前端表格中利用自定义公式实现“四舍六入五成双”.doc

    “银行家算法”大揭秘!在前端表格中利用自定义公式实现“四舍六入五成双”.doc

    数据修约(四舍五入\整数位修约)

    1.采用两种方式实现数据修约【①IEEE754的银行家算法、②传统的四舍五入】。 2.实现Decimal、double、string三种数据类型的数据修约。 3.实现了指定小数位、指定整数位的数据修约。

    Javascript中 toFixed四舍六入方法

    银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。 简单来说就是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。但是不论引入toFixed解决...

    JS处理数据四舍五入(tofixed与round的区别详解)

    但是其四舍五入的规则与数学中的规则不同,使用的是银行家舍入规则,银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。具体规则如下: 简单来说就是:四舍六入五考虑,五后非零...

    Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法

    前言 在公司项目中涉及到一个有大量浮点数价格计算的模块,从而引发了我一系列的思考: 计算机二进制环境下浮点数的计算精度缺失...银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法

    C语言实现的银行家算法

    刚编出的操作系统中银行家算法实现。其中的安全性算法没有分成子函数,整个程序只有main()函数,很简陋,望大虾们指点用子函数实现安全性算法的方法...主要是传值问题..或是跟好的实现方法.谢谢...

    round2even:执行舍入到偶数运算。 此操作比舍入到更大更准确。-matlab开发

    round2even 函数执行round to even,这与round to large 不同。 返回值是最接近表达式值的数字,并带有适当的小数位数。 如果表达式正好位于两个可能的舍入值之间,则该函数... 注意:舍入到偶数有时称为银行家舍入。

    人力资源管理软件(完全免费)

    本人力资源软件包含支持单机、网络,可以通过互联网安全接入企业内网,无需域名或固定IP 用户资料可定制扩展,界面可定义,适应性强 大量的统计分析报表,便于掌握业务情况 本人力资源软件包含提供了自定义报表...

Global site tag (gtag.js) - Google Analytics