Как производить корректное умножение/деление чисел в формате float?

Как избавиться от такого?

i = 305.9
n = i * 100
print(n)
30589.999999999996

Есть более глобальный способ, или нужно округлять round'ом после каждого действия?


Ответы (1 шт):

Автор решения: insolor
  1. Округлять при выводе до приемлемого количества знаков после запятой:

    i = 305.9
    n = i * 100
    print(f"{n:.2f}")  # 30590.00
    

    Округлять постоянно при каждом действии не нужно.

  2. Использовать класс Decimal

    from decimal import Decimal
    
    i = Decimal("305.9")
    n = i * 100
    print(n)  # 30590.0
    

    Опять же, не нужно все оборачивать в Decimal - а только там, где у вас появляется дробное число. Например, при вводе числа пользователем.

    Но стоит учитывать, что Decimal работает медленнее, чем float. Модуль decimal сейчас написан на Си, так что разница в производительности для CPython будет не в сотни раз, а максимум раз в 10 (рандомный бенчмарк на моем компютере на CPython 3.8 показал разницу ~в два раза), но если производительность критична, лучше Decimal не использовать.

→ Ссылка