Python舍入问题

时间:2010-05-21 08:28:58

标签: python math floating-point

>>> num = 4.123456
>>> round(num, 3) # expecting 4.123
4.1230000000000002

结果我期待4.123,我错了吗?

4 个答案:

答案 0 :(得分:7)

这不是一个错误。你需要阅读科学家应该知道的关于浮点运算的内容:

http://docs.sun.com/source/806-3568/ncg_goldberg.html

答案 1 :(得分:6)

是的,您的期望与您工具的设计意图不符。

查看Python教程的this section


使用math.round实际上非常罕见。如果您尝试将数字显示为某个精度的字符串,则可能需要更像

的内容
>>> num = 4.123456
>>> print "%.3f" % num
4.123

您可能对string formatting上的文档感兴趣。

答案 2 :(得分:4)

为什么要关心? (这是一个严肃的问题。)

你得到的答案非常接近4.123而没有任何区别。它不能完全是4.123,因为Python可以精确地表示有限的许多数字(在典型机器上大约2**64),并且没有详细介绍浮点表示,它只是恰好4.123不是其中之一。顺便说一下,4.1230000000000002也不是可以准确表示的数字之一;存储的实际数字是4.12300000000000022026824808563105762004852294921875,但Python将十进制表示截断为17位有效数字以用于显示目的。所以:

  1. 如果你正在用结果进行数学运算,那么4.123与你得到的数据之间的差异是如此微小,以至于没有真正的区别。只是不要担心。
  2. 如果您只关心输出看起来很漂亮(例如,您在此处的内容是字符串而不是数字),请使用str或字符串格式。
  3. 在不太可能的情况下,差异确实很重要,例如,因为您正在进行财务工作,这会影响以后某些事情的发展方向,请使用decimal模块。
  4. 最后注意事项:在Python 3.x和Python 2.7中,浮点数的repr已经发生变化,因此您实际上会得到4.123,如您所愿。

答案 3 :(得分:2)

如果您希望拥有浮点数的完全表示,则必须使用decimal