python - python 中 a-b ==0 和 a ==b 有什么区别

标签 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/

相关文章:

python - 如何在 Django 中访问 table_name 变量?

python - Django 克隆递归对象

python - 如何重建金字塔三角形?

python - 如何使用 python Imaging 创建新的彩色图像?

python - 为 pyspark 中的唯一行生成序列列

python - 提高代码可读性,让python脚本更优雅

python - 使用python mechanize下载zip文件

python - 如何抑制警告 QPixmap : It is not safe to use pixmaps outside the GUI thread

python - 如何获得最后n行的标准差?

Java 等价于 Python 字典