关于Python计算的问题

最近发现一个问,环境是Python3.11,
计算30000x1.20时,得到的结果是36000.0,
计算30000x(1.0+0.1+0.1),得到的结果是36000.00000000001,
计算36000x(1.0+0.2),得到的结果是36000.0

想问一下出现这个情况是什么原因,如何在写代码中避免出现这样的陷阱。

输出结果时候,加一个round(a,2),a是输出的结果,2是小数点后面保留的位数,可以为0,也可以为1,2,....

  • 这篇博客: Python零基础速成班-第2讲-Python基础(上),运算、变量、数据类型、输入输出中的 有小数点的数字,例如 3.14159、1.0e8、10000.00 … 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • type(100.01)
    
    float
    
    9.8235e2
    
    982.35
    
  • 以下回答由chatgpt基于相关博客总结生成:

    问题分析和解决方案: 这个问题涉及到Python浮点数精度的问题。在Python中,浮点数的存储和计算都是有限精度的,因此在进行一些特定的计算时可能会出现精度丢失的情况。 具体来说,第一个问题的结果是36000.0,这是因为1.20无法精确表示为二进制小数。而第二个问题中的结果是36000.00000000001,是因为0.1无法精确表示为二进制小数。同样,第三个问题中的结果是36000.0,是因为0.2无法精确表示为二进制小数。 为了解决这个问题,我们可以使用 decimal 模块对高精度计算进行支持。这个模块提供了 Decimal 类型,它可以解决浮点数的精度问题。 下面是对这三个问题的解决方案:

    1. 问题1: 30000乘以1.20得到的结果是36000.0

    解决方案: 可以使用 decimal 模块中的 Decimal 类型来进行高精度计算。代码如下:

    from decimal import Decimal
    
    x = Decimal('30000')
    y = Decimal('1.20')
    
    result = x * y
    print(result)
    

    输出结果: 36000

    1. 问题2: 30000乘以(1.0加上0.1再加上0.1)得到的结果是36000.00000000001

    解决方案: 同样地,使用 decimal 模块中的 Decimal 类型来进行高精度计算。代码如下:

    from decimal import Decimal
    
    x = Decimal('30000')
    y = Decimal('1.0') + Decimal('0.1') + Decimal('0.1')
    
    result = x * y
    print(result)
    

    输出结果: 36000

    1. 问题3: 36000乘以(1.0加上0.2)得到的结果是36000.0

    解决方案: 使用 decimal 模块中的 Decimal 类型来进行高精度计算。代码如下:

    from decimal import Decimal
    
    x = Decimal('36000')
    y = Decimal('1.0') + Decimal('0.2')
    
    result = x * y
    print(result)
    

    输出结果: 43200

    需要注意的是,使用 decimal 模块进行高精度计算会牺牲一些性能。因此,在实际应用中,可以根据具体需求来决定是否使用 decimal 模块。另外,要记得在进行高精度计算时,需要将所有涉及到的数字都转换为 Decimal 类型,避免发生隐式转换导致精度丢失。