Подтвердить что ты не робот

Округлить до второго знака после запятой в Python

Как я могу округлить число до второго знака после запятой в Python? Например:

+0,022499999999999999

Должен округлять до 0,03

0,1111111111111000

Должен округлять до 0,12

Если в третьем десятичном знаке есть какое-либо значение, я хочу, чтобы оно всегда округлялось, оставляя мне 2 значения после запятой.

4b9b3361

Ответ 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.
Лучше использовать другой метод, представленный выше.