pythonpython-3.xfloating-pointdecimalincrement

Incrementing to the last decimal in python


I want to write function in python when given float or string for example 0.003214 to return me 0.003215, but if I give it 0.00321 to return 0.003211, it will apply on other floats also like 0.0000324 -> 0.00003241. What is wrong with my solution and how do I fix it?

def add_one_at_last_digit(v):
    after_comma = Decimal(v).as_tuple()[-1]*-1
    add = Decimal(1) / Decimal(10**after_comma)
    return Decimal(v) + add

Solution

  • Here is a working solution

    from decimal import Decimal
    
    def add_one_at_last_digit(v: float | str) -> float:
        d = Decimal(str(v))
        
        decimal_places = abs(d.as_tuple().exponent)
        
        add = Decimal(f"1e-{decimal_places}")
        
        result = (d + add).quantize(Decimal(f"1e-{decimal_places}"))
        
        return float(result)
    

    The key ideas are:

    >>> Decimal(213.4)
    Decimal('213.400000000000005684341886080801486968994140625')
    >>> Decimal("213.4")
    Decimal('213.4')
    

    You did not do this in your solution which is why your after_comma is wrong.