python np.round() 使用大于2的decimal选项
Python有一个默认的round()函数,但我在用cython编程的时候,想用numpy的函数来替代Python的代码。不过,当我在终端实验的时候,得到了以下结果。
>>> 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 个回答
21
问题在于,浮点数的二进制表示法不能准确表示大多数十进制数字。举个例子,最接近1.235的两个值是:
- 1.2350000000000000976996261670137755572795867919921875
- 1.234999999999999875655021241982467472553253173828125
因为第一个值更接近我们想要的1.235,所以程序会选择这个值。
当你在Python环境中显示一个浮点数时,它会使用__repr__
这个转换函数,这个函数会显示足够多的数字,以便准确识别这个数字。如果你使用__str__
这个转换,结果会四舍五入到一个合理的位数。至少内置的float
类型是这样工作的,我想numpy也是一样的。print
函数默认调用__str__
,所以你可以试试这个:
print np.around(1.23456789, decimals=3)
如果你的应用需要绝对的十进制精度,可以使用decimal
模块。这个模块也可以进行四舍五入。