【问题标题】:what is the different between a-b ==0 and a ==b in python [duplicate]python中的a-b ==0和a ==b有什么区别[重复]
【发布时间】:2021-10-10 12:23:27
【问题描述】:

这是代码。

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 64bit

【问题讨论】:

标签: python


【解决方案1】:

这是因为浮点数错误可能发生在较大或较小的浮点数上。查看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) 时,这将被正确转换。

【讨论】:

    【解决方案2】:
    math.pow, value type is float
    a = math.pow(10,100)
    b = float(10 ** 100)
    a==b is true
    

    【讨论】:

    • 是的。这是真的。为什么不能用 a=int(math.pow(10,100)) 来比较?
    • @pythonnoob 实际上可以,但是请参阅其他答案,了解为什么必须小心更大的数字会丢失精度
    【解决方案3】:

    对于大数字,精度较低,这就是为什么一个是True,另一个是False,如果您尝试使用较小的数字,您会看到两者的计算结果都是True

    >>> math.pow(10,15)
    1000000000000000.0
    >>> 10**15
    1000000000000000
    >>> math.pow(10,15)==10**15
    True
    
    >>> math.pow(10,20)
    1e+20
    >>> 10**20
    100000000000000000000
    >>> math.pow(10,20) == 10**20
    True
    

    但是如果你看一些用指数表示的更大的数字:

    >>> math.pow(10,50)
    1e+50
    >>>10**50
    100000000000000000000000000000000000000000000000000
    >>> math.pow(10,50)==10**50
    False
    

    如果你尝试将它转换为整数,你会看到数字只是改变了:

    >>> int(math.pow(10,50))
    100000000000000007629769841091887003294964970946560
    

    【讨论】:

      【解决方案4】:

      也许这对你有帮助:

      import math
      
      a = math.pow(10,100)
      b = 10 ** 100
      
      print(a==b)
      
      print(a)
      print(b)
      
      print(a-b==0)
      
      
      a = "{:.1e}".format(a)
      b = "{:.1e}".format(b)
      a == b
      

      输出:

      False
      1e+100
      10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
      True
      True
      

      【讨论】:

        【解决方案5】:

        对于较大的数字(如您使用过的math.pow(10, 100)),a-b == 0 返回 False,因为 Floating point arithmetic

        math.pow() - 将其参数转换为float 类型

        来自Docs

        与内置的 ** 运算符不同,math.pow() 将其两个参数都转换为浮点类型。

        **pow() - 返回一个整数。

        使用** 或内置的pow() 函数计算精确的整数幂。

        import math
        a = 10**2
        b = math.pow(10,2)
        c = pow(10,2)
        
        print(f'a: {a}\nb: {b}\nc: {c}')
        print(a==b)
        print(a-b==0)
        
        a: 100
        b: 100.0
        c: 100
        True
        True
        

        从上面的结果,你可以看到types他们返回了什么。

        在这种情况下,a-b == 0 也会返回 True,因为数字很小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-25
          • 2018-06-27
          • 2017-04-06
          • 1970-01-01
          • 1970-01-01
          • 2012-07-03
          • 1970-01-01
          • 2019-01-19
          相关资源
          最近更新 更多