Округлить до второго знака после запятой в Python
Как я могу округлить число до второго знака после запятой в Python? Например:
+0,022499999999999999
Должен округлять до 0,03
0,1111111111111000
Должен округлять до 0,12
Если в третьем десятичном знаке есть какое-либо значение, я хочу, чтобы оно всегда округлялось, оставляя мне 2 значения после запятой.
Ответы
Ответ 1
Python включает функцию round()
, которая позволяет указать количество цифр, которое вы хотите. Из документации:
round(x[, n])
Возвращает значение с плавающей точкой x, округленное до n цифр после десятичной точки. Если n опущено, по умолчанию оно равно нулю. Результатом является число с плавающей запятой. Значения округляются до ближайшего кратного 10 до мощности минус n; если два кратных одинаково близки, округление выполняется от 0 (так, например, раунд (0,5) равен 1,0 и раунд (-0,5) равен -1,0).
Итак, вы хотите использовать round(x, 2)
для нормального округления. Чтобы убедиться, что номер всегда округлен, вам нужно использовать функцию ceil(x)
. Аналогично, для округления используйте floor(x)
.
Ответ 2
from math import ceil
num = 0.1111111111000
num = ceil(num * 100) / 100.0
Смотрите:
math.ceil
документация
round
documentation - Вероятно, вы захотите проверить это в будущем для справки
Ответ 3
Экстраполяция из ответа Эдвина:
from math import ceil, floor
def float_round(num, places = 0, direction = floor):
return direction(num * (10**places)) / float(10**places)
Для использования:
>>> float_round(0.21111, 3, ceil) #round up
>>> 0.212
>>> float_round(0.21111, 3) #round down
>>> 0.211
>>> float_round(0.21111, 3, round) #round naturally
>>> 0.211
Ответ 4
x = math.ceil(x * 100.0) / 100.0
Ответ 5
Это зависит от поведения, которое вы хотите при рассмотрении положительных и отрицательных чисел, но если вы хотите, чтобы что-то всегда округлялось до большего значения (например, 2.0449 → 2.05, -2.0449 → -2.04), вы можете сделать:
round(x + 0.005, 2)
или немного любитель:
def round_up(x, place):
return round(x + 5 * 10**(-1 * (place + 1)), place)
Это также работает следующим образом:
round(144, -1)
# 140
round_up(144, -1)
# 150
round_up(1e308, -307)
# 1.1e308
Ответ 6
Обратите внимание, что трюк ceil(num * 100) / 100
выйдет из строя на некоторых вырожденных входах, например, 1e308. Это может часто возникать, но я могу сказать, что это стоило мне всего пару дней. Чтобы избежать этого, было бы неплохо, если бы ceil()
и floor()
взяли аргумент десятичных знаков, например round()
. Между тем, кто-нибудь знает чистую альтернативу, которая не будет терпеть крах на таких входах? У меня были некоторые надежды на пакет decimal
, но он тоже умирает:
>>> from math import ceil
>>> from decimal import Decimal, ROUND_DOWN, ROUND_UP
>>> num = 0.1111111111000
>>> ceil(num * 100) / 100
0.12
>>> float(Decimal(num).quantize(Decimal('.01'), rounding=ROUND_UP))
0.12
>>> num = 1e308
>>> ceil(num * 100) / 100
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
OverflowError: cannot convert float infinity to integer
>>> float(Decimal(num).quantize(Decimal('.01'), rounding=ROUND_UP))
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
Конечно, можно сказать, что сбой является единственным нормальным поведением на таких входах, но я бы сказал, что это не округление, а умножение, вызывающее проблему (почему, например, 1e306 не сбой) и более чистая реализация флага nn-round-n-го места могла бы избежать взлома размножения.
Ответ 7
def round_up(number, ndigits=None):
# start by just rounding the number, as sometimes this rounds it up
result = round(number, ndigits if ndigits else 0)
if result < number:
# whoops, the number was rounded down instead, so correct for that
if ndigits:
# use the type of number provided, e.g. float, decimal, fraction
Numerical = type(number)
# add the digit 1 in the correct decimal place
result += Numerical(10) ** -ndigits
# may need to be tweaked slightly if the addition was inexact
result = round(result, ndigits)
else:
result += 1 # same as 10 ** -0 for precision of zero digits
return result
assert round_up(0.022499999999999999, 2) == 0.03
assert round_up(0.1111111111111000, 2) == 0.12
assert round_up(1.11, 2) == 1.11
assert round_up(1e308, 2) == 1e308
Ответ 8
Указанная круглая функция не работает для определенных целых чисел, таких как:
а = 8
круглая (а, 3)
8,0
а = 8.00
круглая (а, 3)
8,0
а = +8,000000000000000000000000
круглая (а, 3)
8,0
но работает для:
г = 400/3.0
р
+133,33333333333334
круглый (г, 3)
133,333
Более того, десятичные дроби, такие как 2,675, округляются до 2,67, а не 2,68.
Лучше использовать другой метод, представленный выше.