Как округлить число с плавающей запятой до определенного десятичного знака?
Предположим, у меня есть 8.8333333333333339
, и я хочу преобразовать его в 8.84
. Как я могу сделать это в Python?
round(8.8333333333333339, 2)
дает 8.83
а не 8.84
. Я новичок в Python или программирования в целом.
Я не хочу печатать это как строку, и результат будет использоваться в дальнейшем. Для получения дополнительной информации о проблеме, пожалуйста, проверьте Тим Уилсон Python Советы по программированию: кредит и калькулятор платежей.
Ответы
Ответ 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
Ответ 9
Используйте decimal
модуль: http://docs.python.org/library/decimal.html
Ответ 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)
раунд работал на меня