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

四舍五入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#的朋友可以参考下

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

    银行家算法是一种特殊的四舍五入算法,用于解决银行业中的利息计算问题。该算法可以确保银行在计算利息时的公平性和准确性。通过使用银行家算法,可以避免因四舍五入误差导致的经济损失。 在前端表格中,银行家算法...

    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函数进行四舍五入运算中出现的问题及其错误原因,需要的朋友可以参考下

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

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

    Javascript中 toFixed四舍六入方法

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

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

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

    【delphi_文章】delphi的取整函数round、trunc、ceil和floor.doc

    Round 函数的实现遵循银行家算法,也就是说,当舍或入位大于或小于五时按四舍五入来处理,而当舍或入位等于五时,就要看前面一位是什么,根据奇进偶不进,它总是返回一个偶数值。 例如: ```delphi var i, j: ...

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

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

    C语言实现的银行家算法

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

    C#程序设计基础教程及实训习题答案.doc

    C#程序设计基础教程及实训习题答案 本教程涵盖了C#程序设计的基础知识,包括C#...*银行家舍入法与四舍五入不同,对.5 的舍入上,采用取偶数的方式。 *银行家舍入法可以避免四舍五入的误差累积,保证计算结果的公平性。

Global site tag (gtag.js) - Google Analytics