不懂就问,Python3中 1 // 0.1 的结果为什么不是整数?
如题,举个例子,python3 中想得到 int(10 / 2),可以用
>>> 10 // 2
5
>>> (10).floordiv(2)
5
同理,想得到 int(1 / 0.1),于是试了一下
>>> 1 // 0.1
9.0
>>> 1 // 0.2
4.0
>>> (1).floordiv(0.1)
NotImplemented
问一下其中的原理
不懂就问,Python3中 1 // 0.1 的结果为什么不是整数?
>>> (1.0).floordiv(0.1)
9.0
另外双下划线不推荐日常使用。
这个问题涉及到浮点数的精度和地板除(//)的行为。
在Python中,1 // 0.1 的结果是 9.0 而不是 10.0,这确实有点反直觉。根本原因在于浮点数 0.1 在二进制中无法被精确表示,它实际上是一个近似值。当你写 0.1 时,Python存储的值略大于数学上的0.1。
我们可以用 format 函数来看看它实际的值:
print(format(0.1, '.20f')) # 0.10000000000000000555
所以实际上计算的是:
1 // 0.10000000000000000555
数学上 1 ÷ 0.1 = 10,但由于浮点误差,0.1 略大于真正的0.1,所以 1 ÷ 0.1 的结果略小于10,地板除取整后就得到了9。
如果你需要精确的十进制运算,应该使用 decimal 模块:
from decimal import Decimal
result = 1 // Decimal('0.1') # 结果是 10
总结:浮点数精度问题导致的。
那说明是把 1 转换成 1.0 了,或者说是内部调用了(0.1).rfloordiv(1),那么问题来了,1.0 // 0.1 结果是 9.0,是怎么计算出来的
楼主应该是需要的 trunc 而不是 floor 吧?
随便搜了下,大概看了下,分享给你: https://blog.csdn.net/huzq1976/article/details/51581330
thx
>>> 1.0 // 0.1
9.0
>>> 1.000000000000001 // 0.1
10.0
懂了吗?
这里的「 0.1 」是要比 0.1 大的。二进制下的 0.1 是一个循环小数,循环小数在有限精度下必然丢失精度,所以「 0.1 」是不等于 0.1 的。
>>> 1.0-.1-.1-.1-.1-.1-.1-.1-.1-.1-.1
1.3877787807814457e-16
之前没注意过这个,因崔斯汀

