Fix float precision with decimal numbers

后端 未结 4 1403
盖世英雄少女心
盖世英雄少女心 2021-01-22 16:49
a = 1

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

This is the result:

1.1
1.2000000000000002
1.3000000000000003
1.4000000000000004
1.         


        
相关标签:
4条回答
  • 2021-01-22 17:19

    You could format your output like this;

    a=1
    for x in range(5):
        a += 0.1
        print("{:.9f}".format(a) )
    
    0 讨论(0)
  • 2021-01-22 17:21

    Formatted output has been duly suggested by @Jaco. However, if you want control of precision in your variable beyond pure output, you might want to look at the decimal module.

    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
    
    0 讨论(0)
  • 2021-01-22 17:28

    can i set the precision of a variable before setting the value?

    Use the decimal module which, unlike float(), offers arbitrary precision and can represent decimal numbers exactly:

    >>> 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
    
    0 讨论(0)
  • 2021-01-22 17:34

    Assuming that your problem is only displaying the number, @Jaco 's answer does the job. However if you're concern about using that variable and potentially make comparisons or assigning to dictionary keys, I'd say you have to stick to round(). For example this wouldn't work:

    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
    

    You'd have to do:

    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
    
    0 讨论(0)
提交回复
热议问题