我的软件的用户抱怨说,在某些情况下,存在明显的舍入错误(由于浮点表示问题):
>>> round(4.55, 1)
4.5
>>> '{:.60f}'.format(4.55)
'4.549999999999999822364316059974953532218933105468750000000000'
我正在考虑将当前的舍入功能替换为以下功能:
>>> def round_human(val, ndigits):
... return round(val * 10 ** ndigits) / 10 ** ndigits
...
>>> round_human(4.55, 1)
4.6
或者(里面的repr
让我感到不安,但由于此时数字已经通过了numpy
,我不确定还有什么更好的选择):
>>> def round_decimal(val, ndigits):
... return float(Decimal(repr(val)).quantize(Decimal(10) ** -ndigits))
...
>>> round_decimal(4.55, 1)
4.6
是否存在这样的情况:这些函数中的任何一个都会产生圆形的结果,而这些结果在人的检查中看起来是错误的?我不担心ndigits
大于3的情况。你知道吗
总的来说,有更好的方法吗?你知道吗
我意识到我可以编写一个测试来强制所有有趣的案例。下面测试中的奇数print语句生成
golden_dict
,然后手动检查它是否有所需的行为。你知道吗最有效的功能是:
这依赖于python神奇的
repr(4.55)
行为,这里描述:https://docs.python.org/2/tutorial/floatingpoint.html和https://bugs.python.org/issue1580(最后一个是传奇)。你知道吗您可以使用以下函数进行舍入;它通常比
round()
本身更有效:相关问题 更多 >
编程相关推荐