NumPy平均函数的四舍五入误差

5
我觉得这很奇怪。有人能告诉我这里发生了什么吗?
>>>a = [1,0,1]
>>>np.mean(a)
   0.66666666666666663
>>>2.0/3
   0.6666666666666666
np.mean(a)输出结果结尾为3是什么原因?为什么不是像下一行那样为6或者四舍五入后为7呢?请说明。

为什么会有踩票?至少解释一下。这似乎完全合理...除非你实际上没有读问题... - Brian
@Brian 这个问题在这个论坛上已经被回答了很多很多次。 - Daniel
4
@Ophion,所以请投反对票,并评论说这是一个重复问题,并提供一个链接。当搜索或相关列表中没有显示出重复问题时,为什么人们就会“投石问路”地向新用户投反对票呢? - Brian
1
@Brain 你可以问他们,但这是一个很容易通过谷歌回答的问题,基本上是 SO 问题清单上的检查项目#1(http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist)。 - Daniel
1
@Ophion:这不是每天看到三次的标准OMG,0.1 + 0.2 = 0.30000004!!,这似乎是一个合理的问题,让我也感到惊讶。 - Bas Swinckels
1个回答

5

这只是两种不同类型的字符串表示的情况:

In [17]: a = [1, 0, 1]

In [18]: mean(a)
Out[18]: 0.66666666666666663

In [19]: type(mean(a))
Out[19]: numpy.float64

In [20]: 2.0 / 3
Out[20]: 0.6666666666666666

In [21]: type(2.0 / 3)
Out[21]: float

In [22]: mean(a).item()
Out[22]: 0.6666666666666666

它们是相等的:

In [24]: mean(a) == 2.0 / 3
Out[24]: True

In [25]: mean(a).item() == 2.0 / 3
Out[25]: True

现在可能是阅读关于 numpy scalarsnumpy dtypes 的时候了。


Python浮点数也应该是64位的,但是numpy打印出来的方式有点奇怪。 - Bas Swinckels
@BasSwinckels 不确定我理解你的论点。你是说因为它们都是具有64位表示的浮点类型,所以它们应该“repr”相同,即使它们在类型层次结构中是不同的类型吗? - Phillip Cloud
我知道它们是具有不同reprs的不同类型,但两者都应该包装相同的float64值。在这种情况下,似乎没有努力使repr显示它真正的类型,所以我觉得有点惊讶的是,他们没有使用相同的算法来创建字符串表示。 - Bas Swinckels
我猜这个问题可能已经在NumPy ML上讨论过了。我现在没时间去查,但我敢打赌你会在那里找到更多信息。 - Phillip Cloud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接