最近在做财务系统中遇到一个关于小数精度的问题: 我们知道计算机在订单结算信息的时候,是通过单条订单计算结算金额,然后整体汇总再给出结果。这样才能支持业务上需要从不同时间维度汇总数据的要求(每3天一结算,每7天一结算,每月一结算等)。但是,作为一个正常用户,我们并不会这么去计算,我们采用的是先汇总商品价格再计算结算金额的方法,如下方展示:
我们刚开始对计算机计算的每一个J1,J2,J3都采取四舍五入的方法,发现最后和人工核对时算出的结果是不一样的,会有精度上的误差。计算机汇总的结果可能是4.56,而人工算的是4.57,那么怎么办呢? 要从两个层面解决这个问题1. 系统层面
通过以上方法,我们保证了整个财务系统精度符合业务要求,能够正常运作。 四舍六入五成双法1. 含义对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位。这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”。 这里“四”是指≤4 时舍去,”六”是指≥6时进上,”五”指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:
从统计学的角度,“四舍六入五成双”比“四舍五入”要科学,在大量运算时,它使舍入后的结果误差的均值趋于零,而不是像四舍五入那样逢五就入,导致结果偏向大数,使得误差产生积累进而产生系统误差,“四舍六入五成双”使测量结果受到舍入误差的影响降到最低。 |
|