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

Rai*_*Lee 7 python numpy rounding cython

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
Run Code Online (Sandbox Code Playgroud)

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

>>> round(1.23456789,3)
1.235
>>> round(1.23456789,4)
1.2346
Run Code Online (Sandbox Code Playgroud)

Mar*_*som 19

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

  • 1.2350000000000000976996261670137755572795867919921875
  • 1.234999999999999875655021241982467472553253173828125

由于第一个更接近期望值,因此它是您获得的值.

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

print np.around(1.23456789, decimals=3)
Run Code Online (Sandbox Code Playgroud)

对于绝对需要十进制精度的应用,有decimal模块.它也可以进行舍入.