四舍五入VS银行家舍入_iteye_309的博客-程序员秘密

技术标签: c#  matlab  

相信细心的程序员们早就发现了.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 标准的语言都是采用这一算法的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteye_309/article/details/82043906

智能推荐

io---BufferedOutputStream_flush-缓冲区写出字节时的缓冲区问题_outputstream怎么开启缓冲区_biu_biubiubiu的博客-程序员秘密

package io;import java.io.BufferedOutputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/**缓冲区写出字节时的缓冲区问题@author W*/public class Buff...

(转)[kaili linux]安装kaili linux到VM_jameskaron的博客-程序员秘密

转自:http://www.yishimei.cn/network/782.htmlkaili linux iso:https://www.kali.org/downloads/上次给大家介绍了关于黑客专用系统Kali Linux后,有许多小伙伴都表现出了极大的兴趣,但是想要彻底深入的学习Kali Linux,不仅要知道它的用途与大概介绍,更要亲身实践才能学到真正的黑客技能,考虑到...

JVM(三)--垃圾收集算法_想飞的盗版鱼的博客-程序员秘密

JVM(三)–垃圾收集算法这篇博客的内容包括:一、垃圾收集算法:1,标记——清除算法:2,复制算法:3,标记——整理算法:4,分代收集算法:二、涉及到的问题:1,标记清除,标记整理,复制算法分别是什么,各有什么缺点2,新生代和老年代各用什么算法?3,为什么要划分新生代和老年代?4,新生代分为什么?年轻代为什么分为Eden和Survior区?5,新生代和老年代的年龄阈值是多少?初识GC自动垃圾回收机制,简单来说就是寻找 Java堆中的无用对象。打个比方:你的房间是

adb实用命令(持续更新中....)_潇曜的博客-程序员秘密

1、获取手机屏幕当前显示的activity名与所属的包名:adb shell dumpsys window windows | findstr Current【延伸阅读】有人会有疑问:adb shell dumsys后面可以接哪些参数呢?其实很简单,我们在cmd中输入以下命令:adb shell service list,就会显示可以显示的参数:Found 178 services:0 ...

互联网产品设计进阶(10)关注项目的赢利模式_cndes的博客-程序员秘密

互联网产品设计进阶(10)关注赢利模式整天都在思考项目的进展,忙碌了一天,终于有点时间来打理思绪。晚上收到一封快件,收到一位编辑朋友送来的几本书,里面有一本最近比较热门的《设计原本》。读一本书时,我喜欢看书的前言,因为这里反映了作者的原始动机。正如书中所写,“思维的过程、人与人的

webpack配置: 如何同时使用ES2015和JSX_weixin_34281477的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

随便推点

Docker部署SkyWalking_skywalking部署docker_疯狂小草的博客-程序员秘密

Docker部署SkyWalking文章目录Docker部署SkyWalking前置环境部署步骤部署服务端 skywalking-oap部署UI skywalking-ui服务器java项目部署源码包下载Jar 直接启动docker启动前置环境docker 19.03.13ElasticSearch 7.2.0部署步骤部署服务端 skywalking-oap -- 使用6.6.0版本的skywalking,先部署服务端 docker run --name skywalking-oap

Android 10 适配攻略,深度解析跳槽从开始到结束完整流程_android 10适配_IT精英时代的博客-程序员秘密

应用在卸载后,会将App-specific目录下的数据删除,如果在AndroidManifest.xml中声明:android:hasFragileUserData="true"用户可以选择是否保留。对于SAF的使用,可以查看我之前写的SAF使用攻略,这里就不展开说了。最后这里有一个介绍Scoped Storage的视频,推荐观看:准备好使用分区存储 | ADS 中文字幕视频准备好使用分区存储2.权限变化==============================================

docker部署Traefik1.7 转发marathon、file_docker traefik 1.7-alpine_常名先生的博客-程序员秘密

Traefik1.7 转发marathon上的服务1、准备docker-compose启动文件注:假设你的主机ip为:10.11.0.0,后面皆以此为假设部署traefik-docker-compose.ymlversion: '3.3'services: reverse-proxy: image: traefik:v1.7-alpine command: --api --docker ports: - "80:80" - "443:443"

Google 2018 IO 大会要点_annkie的博客-程序员秘密

人工智能Google Assistant机器学习套件 ML Kit跨平台支持支持文本识别、人脸检测、条码扫描、图像标记和地标识别支持离线和在线使用AR视觉定位系统 Vision Position System,简称VPS通过手机摄像头,用AR技术来为用户进行导航。Google Maps个性化更准确自动驾驶 Waymo操作系统Android P防沉迷系...

642-274认证题库首先Passquick_alisaga的博客-程序员秘密

642-274认证题库首先Passquick642-274 IMPS MeetingPlace支持专家考试编号:642-274 认证:支持专家的MeetingPlace时间:75分钟(55-65题)可用语言:英语点击这里注册:Pearson VUE的考试政策:了解当前的政策和要求,考试教程:审查考试型的问题见下列642-274认证题库介绍。<br /> <br />642-274 认证题库 <br />Implementing Cisco Unified MeetingPlace Services<br /

推荐文章

热门文章

相关标签