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
posted @ 2021-03-15 14:29  CH|heyi  阅读(448)  评论(0编辑  收藏  举报