【问题标题】:Fix float precision with decimal numbers使用十进制数修复浮点精度
【发布时间】:2016-06-18 17:55:19
【问题描述】:
a = 1

for x in range(5):
    a += 0.1
    print(a)

这是结果:

1.1
1.2000000000000002
1.3000000000000003
1.4000000000000004
1.5000000000000004

我该如何解决这个问题? round() 函数是唯一的方法吗?我可以在设置变量值之前设置变量的精度吗?

【问题讨论】:

    标签: python rounding


    【解决方案1】:

    你可以像这样格式化你的输出;

    a=1
    for x in range(5):
        a += 0.1
        print("{:.9f}".format(a) )
    

    【讨论】:

      【解决方案2】:

      我可以在设置值之前设置变量的精度吗?

      使用decimal 模块,与float() 不同,它提供任意精度并且可以精确地表示十进制数:

      >>> from decimal import Decimal, getcontext
      >>> 
      >>> getcontext().prec = 5
      >>> 
      >>> a = Decimal(1)
      >>> 
      >>> for x in range(5):
      ...     a += Decimal(0.1)
      ...     print(a)
      ... 
      1.1000
      1.2000
      1.3000
      1.4000
      1.5000
      

      【讨论】:

        【解决方案3】:

        假设您的问题只是显示数字,@Jaco 的答案就可以了。但是,如果您担心使用该变量并可能进行比较或分配给字典键,我会说您必须坚持使用 round()。例如这是行不通的:

        a = 1
        for x in range(5):
            a += 0.1
            print('%.1f' % a)
            if a == 1.3:
                break
        
        1.1
        1.2
        1.3
        1.4
        1.5
        

        你必须这样做:

        a = 1
        for x in range(5):
            a += 0.1
            print('%.1f' % a)
            if round(a, 1) == 1.3:
                break
        
        1.1
        1.2
        1.3
        

        【讨论】:

          【解决方案4】:

          @Jaco 已正式建议格式化输出。但是,如果您想控制变量的精度而不是纯输出,您可能需要查看decimal 模块。

          from decimal import Decimal
          
          a = 1
          for x in range(3):
              a += Decimal('0.10')  # use string, not float as argument
              # a += Decimal('0.1000')
              print(a)  # a is now a Decimal, not a float
          
          > 1.10  # 1.1000
          > 1.20  # 1.2000
          > 1.30  # 1.3000
          

          【讨论】:

          • 使用字符串作为Decimal() 的输入的好建议。不知何故,我错过了那个有用的功能。
          • @Chris 阅读您的答案,我不得不承认,我不知道您可以使用 get_context 设置一般精度:D 我只使用上下文来设置一般舍入行为。
          猜你喜欢
          • 2014-08-14
          • 2014-02-07
          • 2016-08-17
          • 1970-01-01
          • 2013-12-16
          • 2015-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多