问题:
由于精度错误,我得到了一个数字,例如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
小数点。
这似乎是一个非常普遍的问题,但令人惊讶的是我找不到任何常规解决方案。
答案 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
同样,这种方法并非适用于每个数字,但会优先考虑您关心的情况-当数字应四舍五入时,您更有可能四舍五入。