Округление десятичных дробей не работает должным образом в python (или django)

Я пытался округлить десятичную дробь в большую сторону с помощью кода, который я нашел ниже, но, похоже, он не работает должным образом в python (django). Вот код:

import math
def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier

Вот некоторые результаты, которые я получаю, когда запускаю функцию:

print(round_up(20.232, 2))
print(round_up(20.211, 2))
print(round_up(20.4, 2))

20.24
20.22
20.4

Однако по какой-то причине я получаю странное значение, когда ввожу 80.4. Я получаю 80.41 вместо 80.4:

print(round_up(80.4, 2))
80.41

Есть ли другой способ округления десятичных дробей в python (django)? Я взял это из интернета, поэтому могут быть другие проблемы, кроме той, о которой я говорил выше (ввод 80.4). В принципе, я просто хочу округлить десятичную дробь до второго знака после запятой, как указано выше (но, конечно, округление 80.4 или 20.3 будет просто 80.4 и 20.3 соответственно). Спасибо, и, пожалуйста, оставляйте любые вопросы, которые у вас есть.

Проблема возникает при умножении плавающих чисел

>>> 80.4 * 100
8040.000000000001

Итак, math.ceil(80.4 * 100) == 8041

Если вы хотите быть точными, вы можете использовать Decimal

from decimal import Decimal, ROUND_CEILING

def round_up_decimal(n, decimals=0):
    multiplier = Decimal(10 ** decimals)
    return (n * multiplier).to_integral(rounding=ROUND_CEILING) / multiplier

print(round_up_decimal(Decimal("20.232"), 2))
print(round_up_decimal(Decimal("20.0"), 2))
print(round_up_decimal(Decimal("20.4"), 2))

print(round_up_decimal(Decimal("80.4"), 2))

Выход

20.24
20
20.4
80.4

Также можно создать еще одну функцию для работы с float

def round_up_float(n, decimals=0):
    return float(round_up_decimal(Decimal(str(n)), decimals)) # uses previous function


print(round_up_float(Decimal("20.232"), 2))
print(round_up_float(Decimal("20.0"), 2))
print(round_up_float(Decimal("20.4"), 2))

print(round_up_float(Decimal("80.4"), 2))

Выход

20.24
20.0
20.4
80.4

Возможно, я неправильно понял ваш вопрос, но, насколько я понимаю, я хотел написать его на случай, если это поможет.


Пробовали ли вы использовать функцию round(), которая уже есть в Python?

round(20.232, 2)
round(20.0, 2)
round(20.4, 2)
round(80.4, 2)

20.23
20.0
20.4
80.4

Повторюсь, я ответил насколько понял, конечно, это готовая функция и это может быть не то, что вы хотите, но если это поможет, я буду рад.

Вернуться на верх