zoukankan      html  css  js  c++  java
  • C#四舍五入导致尾差

    生活中对于小数位多的情况下,会理所当然的应用四舍五入算法进行数据小数位保留,比如保留小数点后两位....
    但是,有一种场景非常有趣,0.5按比例拆分成0.125和0.375之后,对拆分结果进行四舍五入后得到0.13和0.38,再加回去后发现结果变成了0.51....

    这就是四舍五入的缺陷,简而言之就是不公正,如何在程序上避免这种情况,首先引入一种算法,叫银行家算法,即四舍六入五取偶....

    什么是银行家算法?
    银行家舍入法是由IEEE 754标准规定的浮点数取整算法 [1] ,大部分的编程软件都使用的是这种方法。 所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。其规则是:当舍去位的数值小于5时,直接舍去该位;当舍去位的数值大于等于6时,在舍去该位的同时向前位进一;当舍去位的数值等于5且(5后不为空且非全0)时,在舍去该位的同时向前位进一;当舍去位的数值等于5且(5后为空或全0)时,如果前位数值为奇,则在舍去该位的同时向前位进一,如果前位数值为偶,则直接舍去该位。
    简单的说,就是:四舍六入五考虑,五后非空就进一,五后为空看奇偶,五前为偶应舍去,五前为奇要进一

    在C#程序中如何使用?

    Math.Round(0.125, 2);//0.12
    Math.Round(0.375, 2);//0.38
    
    人说,如果你很想要一样东西,就放它走 。如果它回来找你,那么它永远都是你的。要是它没有回来,那么不用再等了,因为它根本就不是你的。 ——伊恩·麦克尤恩 ​
  • 相关阅读:
    四种常见系统架构介绍
    NC-UAP客户化开发-数据建模
    NC-UAP客户化开发-4.NC数据库持久化技术
    NC-UAP客户化开发-NC基础技术
    NC-UAP客户化开发-开发环境搭建
    Docker: 使用socket 代理
    Disk:磁盘管理之LVM和系统磁盘扩容
    Grafana & Graphite & Collectd:监控系统
    ELK:收集k8s容器日志最佳实践
    Virus:病毒查杀
  • 原文地址:https://www.cnblogs.com/ButterflyEffect/p/14537430.html
Copyright © 2011-2022 走看看