python np.round() 使用大于2的decimal选项

9 投票
1 回答
29956 浏览
提问于 2025-04-17 21:22

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模块。这个模块也可以进行四舍五入。

撰写回答