Округление десятичных дробей не работает должным образом в 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
Повторюсь, я ответил насколько понял, конечно, это готовая функция и это может быть не то, что вы хотите, но если это поможет, я буду рад.