问python大牛们:为什么 10 // (10/3) = 2.0 in python

m
microsat
楼主 (北美华人网)
为什么 10 // (10/3)  = 2.0 in python
而不是等于3
然而,floor(10 / (10/3)) = 3
这个//操作不是叫做floor division吗?
m
minqidev
10/3.3333333 = 3.0000000001 floor(3.00000000001) = 3

在python里也是3
C
Cumberbitch
我就知道又是你
m
microsat
10/3.3 = 3.03 floor(3.03) = 3

在python里也是3
minqidev 发表于 2022-12-09 15:27

那第一个 // 操作,不是通常称为 “floor division” 吗?
m
microsat
10/3.3333333 = 3.0000000001 floor(3.00000000001) = 3

在python里也是3
minqidev 发表于 2022-12-09 15:27

注意是两个斜杠。不是一个斜杠。
m
minqidev
那第一个 // 操作,不是通常称为 “floor division” 吗?
microsat 发表于 2022-12-09 15:29

是两个//啊, 这样你就能理解了把。 有一个operator优先级得。 即使你是有括号,可能经过某些优化,计算得结果就是10/3.3333333, 也有可能是 10/3.333334。 编译器里面有种移位计算,比如左移两位,右移两位,其实就是值不变, 10/(10/3) 相当于乘以10再除以10,所以编译器优化过得话,可以快速得出结果。
对于编译器来说,张这个样


其实是 10//3.33334
m
microsat
是两个//啊, 这样你就能理解了把。 有一个operator优先级得。 即使你是有括号,可能经过某些优化,计算得结果就是10/3.3333333, 也有可能是 10/3.333334。 编译器里面有种移位计算,比如左移两位,右移两位,其实就是值不变, 10/(10/3) 相当于乘以10再除以10,所以编译器优化过得话,可以快速得出结果。
其实是 10//3.33334
minqidev 发表于 2022-12-09 15:33

为何floor(10/(10/3))就没有这个问题呢?
m
minqidev
为何floor(10/(10/3))就没有这个问题呢?
microsat 发表于 2022-12-09 15:43

计算器就是两种队列,下面只是大概介绍,没时间完全写对,自己去理解把 floor(10.(10/3)) 对于程序来说长这个样, 第【1】【2】可以快速消掉 计算队列: [1] / [2] x [3] / [4] floor 数字队列 [1] 10 [2] 10 [3] 3 [4] last result
10//(10/3), 这里的 【1】【2】,因为 // 和 x 不是相反计算,不能直接快速消掉 计算队列: [1] // [2] x [3] / [4] floor 数字队列 [1] 10 [2] 10 [3] 3 [4] last result
d
dngdnhxqs
楼主你学的怎么样啦。
m
microsat
楼主你学的怎么样啦。
dngdnhxqs 发表于 2022-12-09 16:05

世界的每一秒都在发生翻天覆地的变化。
你学的越多,你越发现你离世界的最前沿越远。
p
poppyjasper
0
p
poppyjasper
0
p
poppyjasper
0
p
poppyjasper
0
b
blueskysea
回复 1楼microsat的帖子
理论上应该是python 存储的10/3 as a float number 稍微比10/3 as a fraction 稍微大点,导致去除10时结果稍微比3小一点,然后floor就是2了。
大喜妞
你是不是用的 Python3? 你分解开来看, 10/3 = 3.333333335. 之所以是3.3333335 而不是3.3333333,是因为需要能够把数值用binary表达。 然后10//3.3333335 = 2

g
gokgs
你是不是用的 Python3? 你分解开来看, 10/3 = 3.333333335. 之所以是3.3333335 而不是3.3333333,是因为需要能够把数值用binary表达。 然后10//3.3333335 = 2


大喜妞 发表于 2022-12-10 21:36

这个是真马工。 哈哈。