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

Как округлить число с плавающей запятой до определенного десятичного знака?

Предположим, у меня есть 8.8333333333333339, и я хочу преобразовать его в 8.84. Как я могу сделать это в Python?

round(8.8333333333333339, 2) дает 8.83 а не 8.84. Я новичок в Python или программирования в целом.

Я не хочу печатать это как строку, и результат будет использоваться в дальнейшем. Для получения дополнительной информации о проблеме, пожалуйста, проверьте Тим Уилсон Python Советы по программированию: кредит и калькулятор платежей.

4b9b3361

Ответ 1

8.833333333339 (или 8.833333333333334, результат 106.00/12), правильно округленный до двух десятичных знаков, равен 8.83. Математически это похоже на то, что вы хотите функция потолка. Тот, что находится в модуле Python math, называется ceil:

import math

v = 8.8333333333333339
print(math.ceil(v*100)/100)  # -> 8.84

Соответственно, функции пола и потолка обычно отображают действительное число до самого большого предыдущего или наименьшего следующего целого числа, которое имеет нулевые десятичные разряды - поэтому, чтобы использовать их для двух знаков после запятой, число сначала умножается на 10 2 (или 100), чтобы сдвинуть десятичную точку и затем затем поделить на нее для компенсации.

Если вы по какой-то причине не хотите использовать модуль math, вы можете использовать эту (минимально проверенную) реализацию, которую я только что написал:

def ceiling(x):
    n = int(x)
    return n if n-1 < x <= n else n+1

Как это относится к связанной проблеме кредитного и платежного калькулятора

снимок экрана вывода калькулятора кредитa

Из примера вывода видно, что они округлили ежемесячный платеж, что многие называют эффектом функции потолка. Это означает, что каждый месяц выплачивается чуть больше 1 & frasl; 12 от общей суммы. Это сделало окончательный платеж немного меньше обычного - оставив оставшийся невыплаченный остаток всего 8.76.

Было бы справедливо использовать обычное округление, создавая ежемесячный платеж 8.83 и чуть более высокий окончательный платеж 8.87. Тем не менее, в реальном мире людям обычно не нравится, когда их платежи растут, поэтому округление каждого платежа является обычной практикой - оно также быстрее возвращает деньги кредитору.

Ответ 2

Это нормально (и не имеет ничего общего с Python), потому что 8.83 не может быть представлен точно как двоичный float, так же как 1/3 нельзя представить точно в десятичный (0.333333... до бесконечности).

Если вы хотите обеспечить абсолютную точность, вам понадобится модуль decimal:

>>> import decimal
>>> a = decimal.Decimal("8.833333333339")
>>> print(round(a,2))
8.83

Ответ 3

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

>>> import decimal
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_UP)
Decimal('8.34')
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN)
Decimal('8.33')
>>> 

Ответ 4

Более простой способ - просто использовать функцию round(). Вот пример.

total_price = float()
price_1 = 2.99
price_2 = 0.99
total_price = price_1 + price_2

Если вы хотите распечатать total_price прямо сейчас, вы получите

3.9800000000000004

Но если вы заключите его в функцию round(), например,

print(round(total_price,2))

Выход равен

3.98

Функция round() работает, принимая два параметра. Первый - это номер, который вы хотите округлить. Во-вторых, число десятичных знаков округляется до.

Ответ 5

Если вы округлите 8.8333333333339 до 2 десятичных знаков, правильным ответом будет 8.83, а не 8.84. Причина, по которой вы получили 8.83000000001, состоит в том, что 8.83 - это число, которое невозможно правильно воспроизвести в двоичном формате, и оно дает вам самый близкий. Если вы хотите напечатать его без всех нулей, сделайте, как говорит VGE:

print "%.2f" % 8.833333333339   #(Replace number with the variable?)

Ответ 6

Если вы хотите округлить, 8.84 - это неправильный ответ. 8,833333333333 округленное 8,83 не 8,84. Если вы хотите всегда округлить, вы можете использовать math.ceil. Сделайте оба в сочетании со строковым форматированием, потому что округление числа с плавающей запятой не имеет смысла.

"%.2f" % (math.ceil(x * 100) / 100)

Ответ 7

Только для записи. Вы можете сделать это следующим образом:

def roundno(no):
    return int(no//1 + ((no%1)/0.5)//1)

Там нет необходимости включать/импортировать

Ответ 8

Самый простой способ сделать это - использовать встроенную функцию:

format()

Например:

format(1.242563,".2f")

Выход будет:

1.24

Так же:

format(9.165654,".1f")

даст:

9.2

Ответ 10

Вот мое решение проблемы округления вверх/вниз

< .5  round down

> = .5  round up

import math

def _should_round_down(val: float):
    if val < 0:
        return ((val * -1) % 1) < 0.5
    return (val % 1) < 0.5

def _round(val: float, ndigits=0):
    if ndigits > 0:
        val *= 10 ** (ndigits - 1)
    is_positive = val > 0
    tmp_val = val
    if not is_positive:
        tmp_val *= -1
    rounded_value = math.floor(tmp_val) if _should_round_down(val) else math.ceil(tmp_val)
    if not is_positive:
        rounded_value *= -1
    if ndigits > 0:
        rounded_value /= 10 ** (ndigits - 1)
    return rounded_value

# test
# nr = 12.2548
# for digit in range(0, 4):
#     print("{} decimals : {} -> {}".format(digit, nr, _round(nr, digit)))

# output
# 0 decimals : 12.2548 -> 12
# 1 decimals : 12.2548 -> 12.0
# 2 decimals : 12.2548 -> 12.3
# 3 decimals : 12.2548 -> 12.25

Ответ 11

Вот простая функция, чтобы сделать это для вас:

def precision(num,x):
    return "{0:.xf}".format(round(num))

Здесь num - десятичное число. х - десятичное число до того места, где вы хотите округлить плавающее число.

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

Пример 1:

precision(10.2, 9)

вернусь

10.200000000 (до 9 знаков после запятой)

Пример 2:

precision(10.2231, 2)

вернусь

10,22 (до двух десятичных знаков)

Ответ 12

У меня есть этот код:

tax = (tax / 100) * price

а затем этот код:

tax = round((tax / 100) * price, 2)

раунд работал на меня