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
答案 0 :(得分:19)
问题是浮点数的二进制表示不能精确地表示大多数十进制数。例如,最接近1.235的两个值是:
由于第一个更接近所需的值,所以它就是你获得的值。
当您让Python环境显示浮点数时,它会使用__repr__
转换函数,该函数显示足够的数字以明确识别数字。如果您使用__str__
转换,则应将数字四舍五入为合理的位数。至少这就是内置的float
类型所做的,我认为numpy的工作方式是一样的。 print
函数默认调用__str__
,请尝试以下操作:
print np.around(1.23456789, decimals=3)
对于绝对需要十进制精度的应用程序,有decimal
module。它也可以进行舍入。