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
    
    人说,如果你很想要一样东西,就放它走 。如果它回来找你,那么它永远都是你的。要是它没有回来,那么不用再等了,因为它根本就不是你的。 ——伊恩·麦克尤恩 ​
  • 相关阅读:
    kubernetes 节点数据彻底清理脚本
    多es 集群数据迁移方案
    .Net Framework各版本微软技术支持及到期日期
    etcd raft 处理流程图系列3-wal的读写
    etcd raft 处理流程图系列2-transport
    etcd raft 处理流程图系列1-raftexample
    一种分布式预写日志系统
    自适应软件缓存管理
    require/import路径中的叹号是什么?
    理解原型链
  • 原文地址:https://www.cnblogs.com/ButterflyEffect/p/14537430.html
Copyright © 2011-2022 走看看