不懂就问, python3 的 1 // 0.1

2019-10-21 11:04:11 +08:00
 chenstack
如题,举个例子,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
问一下其中的原理
3380 次点击
所在节点    Python
8 条回复
est
2019-10-21 11:06:30 +08:00
>>> (1.0).__floordiv__(0.1)
9.0



另外双下划线不推荐日常使用。
chenstack
2019-10-21 11:12:24 +08:00
@est 那说明是把 1 转换成 1.0 了,或者说是内部调用了(0.1).__rfloordiv__(1),那么问题来了,1.0 // 0.1 结果是 9.0,是怎么计算出来的
datou
2019-10-21 11:22:17 +08:00
楼主应该是需要的 trunc 而不是 floor 吧?
Northxw
2019-10-21 11:28:31 +08:00
随便搜了下,大概看了下,分享给你: https://blog.csdn.net/huzq1976/article/details/51581330
chenstack
2019-10-21 11:45:45 +08:00
@Northxw thx
msg7086
2019-10-21 14:43:09 +08:00
>>> 1.0 // 0.1
9.0
>>> 1.000000000000001 // 0.1
10.0

懂了吗?

这里的「 0.1 」是要比 0.1 大的。二进制下的 0.1 是一个循环小数,循环小数在有限精度下必然丢失精度,所以「 0.1 」是不等于 0.1 的。
msg7086
2019-10-21 14:44:12 +08:00
>>> 1.0-.1-.1-.1-.1-.1-.1-.1-.1-.1-.1
1.3877787807814457e-16
catroll
2019-10-24 18:43:02 +08:00
@Northxw 之前没注意过这个,因崔斯汀

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/611300

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX