python np.round(),十进制选项大于2

时间:2014-03-07 22:20:24

标签: python numpy cython rounding

Python有默认的round()函数,但是我用cython编程,想用numpy函数替换pythonic代码。但是,在终端中进行实验时,我得到了以下结果。

>>> np.around(1.23456789)
1.0
>>> np.around(1.23456789, decimals=0)
1.0
>>> np.around(1.23456789, decimals=1)
1.2
>>> np.around(1.23456789, decimals=2)
1.23
>>> np.around(1.23456789, decimals=3)
1.2350000000000001
>>> np.around(1.23456789, decimals=4)
1.2345999999999999

这有点奇怪,我仍然想要以下“期望”的结果:

>>> round(1.23456789,3)
1.235
>>> round(1.23456789,4)
1.2346

1 个答案:

答案 0 :(得分:19)

问题是浮点数的二进制表示不能精确地表示大多数十进制数。例如,最接近1.235的两个值是:

  • 1.2350000000000000976996261670137755572795867919921875
  • 1.234999999999999875655021241982467472553253173828125

由于第一个更接近所需的值,所以它就是你获得的值。

当您让Python环境显示浮点数时,它会使用__repr__转换函数,该函数显示足够的数字以明确识别数字。如果您使用__str__转换,则应将数字四舍五入为合理的位数。至少这就是内置的float类型所做的,我认为numpy的工作方式是一样的。 print函数默认调用__str__,请尝试以下操作:

print np.around(1.23456789, decimals=3)

对于绝对需要十进制精度的应用程序,有decimal module。它也可以进行舍入。