分数的“多级舍入”是一回事吗?

时间:2018-06-28 15:45:14

标签: rounding-error rounding

问题:

由于精度错误,我得到了一个数字,例如0.004999999999。从数学上讲0.00499(9)等于0.005 精确,但在计算机中不这样。

这样的精度水平仍然很好,但是当我显示数字时,用户希望看到0.01,即四舍五入到小数点后两位,但是显然任何明智的四舍五入算法都会返回0.00因为0.004999999999肯定比0.00更接近0.01

但是用户强烈希望看到0.01

解决方案(?):

可以使用0.004999999999.round(10).round(2)之类的“多级舍入”来完成,前提是我们在内部将所有内容计算为精确到10小数点。

这似乎是一个非常普遍的问题,但令人惊讶的是我找不到任何常规解决方案。

1 个答案:

答案 0 :(得分:0)

双重舍入方法没有什么问题,只是要注意二进制数字不能精确表示小数,因此有时结果不是您所期望的。您的示例可在Python中运行,但另一个非常相似的示例则不能:

>>> round(round(0.004999999999, 10), 2)
0.01
>>> round(round(0.044999999999, 10), 2)
0.04

在第一种情况下,第一个舍入产生的数字只是在 0.005,而第二个舍入产生的数字只是在 0.045;确切的数字是0.005000000000000000104083408558608425664715468883514404296875和0.04499999999999999833466546306226518936455249786376953125。使用二进制数是不可能的。如果您的语言使用十进制数字系统,则可以通过避免使用二进制格式来获得一致的结果。

另一种方法是将数字乘以非常小的数量,以便将接近边界的东西推到上面。

>>> round(0.004999999999 * 1.000000001, 2)
0.01
>>> round(0.044999999999 * 1.000000001, 2)
0.05

同样,这种方法并非适用于每个数字,但会优先考虑您关心的情况-当数字应四舍五入时,您更有可能四舍五入。