python - python中ab ==0和a ==b有什么区别
问题描述
这是代码。
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 与 ab == 0 不同?
我的 python 版本是 3.9.6 64bit
解决方案
这是因为浮点数错误可能发生在大浮点数或小浮点数上。在https://docs.python.org/3/tutorial/floatingpoint.html上查看更多信息
浮点数存储为 53 位。所以这个问题不会发生在浮点数低于4503599627370496
. 有关详细信息,请参阅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
是一个浮点数并且b
是一个整数。
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)
,它将被正确转换。
推荐阅读
- typescript - 在 typescript 中引用 VSS.SDK。错误:未定义 VSS
- flutter - 如何在 ShowDialog 上制作样式小部件?
- typescript - 必须在 className 中使用解构道具分配
- ios - Firebase:Flutter 电话身份验证不起作用并且应用程序崩溃
- python - 将数据框写入 txt 文件
- javascript - 如何防止从“私有”模块导入?
- java - Java:将日期拆分为 n 部分
- ios - UITableView 在设备旋转后保持滚动位置
- amazon-s3 - 将 RDS 数据增量传输到 Parquet 中的 s3
- perl - 使用 Soap::Lite 将客户端证书发送到 SOAP 服务器