<分区>
这是代码。
import math
a = math.pow(10,100)
b = 10 ** 100
c = 10 ** 100
print(a==b) # false
print(a-b==0) # true
我知道当数字太大时 math.pow 不正确。但是如何理解下一点 a == b 与 a-b == 0 不同?
我的python版本是3.9.6 64位
标签 python
<分区>
这是代码。
import math
a = math.pow(10,100)
b = 10 ** 100
c = 10 ** 100
print(a==b) # false
print(a-b==0) # true
我知道当数字太大时 math.pow 不正确。但是如何理解下一点 a == b 与 a-b == 0 不同?
我的python版本是3.9.6 64位
最佳答案
这是因为大 float 或小 float 都可能发生浮点错误。查看更多信息 https://docs.python.org/3/tutorial/floatingpoint.html
float 存储为 53 位。所以这个问题不会发生在小于4503599627370496
的 float 上。参见 https://en.wikipedia.org/wiki/IEEE_754-1985了解更多信息。
import math
a = math.pow(10,100)
b = 10 ** 100
print(type(a)) # float
print(type(b)) # int
我们可以看到a
是一个float,b
是一个int。
print(int(a)) # 10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104
如果我们将 a
转换为 int,我们会看到数字已经改变,不再是 math.pow(10,100)
print(a==b) # false
print(int(a)==int(b)) # false
print(float(a)==float(b)) # true
print(a-b==0) # true
如果我们尝试将两者都转换为 int 它将与 a==b
相同,但如果我们将两者都转换为 float 它将起作用。那是因为两个数字都会得到相同的转换错误。
当我们执行 print(a-b==0)
时,这将被正确转换。
关于python - python 中 a-b ==0 和 a ==b 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68667490/