奇怪的行为`np.楼层()`and float除法

2024-04-26 14:14:02 发布

您现在位置:Python中文网/ 问答频道 /正文

这是怎么回事?在

In [86]:  np.floor(10.0 * .91)
Out[86]:  9.0

In [87]:  np.floor(10.0 * .91)/10.0
Out[87]:  0.90000000000000002

为什么不0.9?在

编辑:

我想这样做:

^{pr2}$

Tags: in编辑npoutpr2floor
2条回答

得到的结果是0.9,或者至少接近双精度浮点数可以得到的0.9:

>>> numpy.float64(0.9)
0.90000000000000002

0.9不能用有限的二进制分数精确表示,所以必须对其进行近似。在

Python内置的浮点类型float总是试图找到最短的十进制表示形式,并将其舍入到给定的浮点数,从而试图对您隐藏问题。这就是为什么你

^{pr2}$

在当前版本的Python中。早期的版本(我认为是2.6版本)会显示与Numpy的浮点数据类型相同的舍入值。在

结果表明,与Python的float相比,numpy有一种不同的算法将float64转换为字符串。在

当字符串0.90000000000000002和0.9被解析为float64时,它们最终具有相同的位模式。在

您可以确认np.floor(10.0 * .91)/10.0 == 0.9产生{}。在

这里的根本问题是,当把一个浮点数转换成一个字符串时,应该给多少个小数位?有些实现使用最小位数,以便将字符串解析为最接近的浮点值将产生相同的值。为了安全起见,有些实现会提供额外的数字。在

因为最终,float(“0.9”)实际上等于0.900000000002204460492503130808472633361640625。所以在某种意义上,这两个答案都是正确的。在


Q&A第二部分:您可以花时间了解浮点的工作原理,也可以使用整数桶作为字典。在

换句话说,不是像-1.0, -0.9, -0.8, ..., 0.9这样的键,而是拥有-10, -9, -8, ..., 9的键。它应该可以防止今后出现很多问题。在

相关问题 更多 >