2024-04-26 14:14:02 发布
网友
这是怎么回事?在
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?在
0.9
我想这样做:
得到的结果是是0.9,或者至少接近双精度浮点数可以得到的0.9:
>>> numpy.float64(0.9) 0.90000000000000002
0.9不能用有限的二进制分数精确表示,所以必须对其进行近似。在
Python内置的浮点类型float总是试图找到最短的十进制表示形式,并将其舍入到给定的浮点数,从而试图对您隐藏问题。这就是为什么你
float
在当前版本的Python中。早期的版本(我认为是2.6版本)会显示与Numpy的浮点数据类型相同的舍入值。在
结果表明,与Python的float相比,numpy有一种不同的算法将float64转换为字符串。在
float64
当字符串0.90000000000000002和0.9被解析为float64时,它们最终具有相同的位模式。在
您可以确认np.floor(10.0 * .91)/10.0 == 0.9产生{}。在
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的键。它应该可以防止今后出现很多问题。在
-1.0, -0.9, -0.8, ..., 0.9
-10, -9, -8, ..., 9
得到的结果是是0.9,或者至少接近双精度浮点数可以得到的0.9:
0.9不能用有限的二进制分数精确表示,所以必须对其进行近似。在
Python内置的浮点类型
^{pr2}$float
总是试图找到最短的十进制表示形式,并将其舍入到给定的浮点数,从而试图对您隐藏问题。这就是为什么你在当前版本的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
的键。它应该可以防止今后出现很多问题。在相关问题 更多 >
编程相关推荐