В документации для функции round () указано, что вы передаете ей число, а позиции после десятичной дроби нужно округлять. Таким образом, он должен сделать это:
n = 5.59
round(n, 1) # 5.6
Но, на самом деле, вкрадывается старая добрая странность с плавающей запятой, и вы получаете:
5.5999999999999996
Для пользовательского интерфейса мне нужно отобразить 5.6
. Я покопался в Интернете и нашел документацию о том, что это зависит от моей реализации Python. К сожалению, это происходит как на моей машине разработчика Windows, так и на каждом сервере Linux, который я пробовал. Смотрите также здесь .
Есть ли способ обойти это, если не считать создания собственной круглой библиотеки?
python
floating-point
rounding
swilliams
источник
источник
round(5.55, 1) = 5.5
.Ответы:
Ничего не могу поделать с тем, как он хранится, но, по крайней мере, форматирование работает правильно:
источник
print '%.2f' % 655.665
но он возвращается655.66
, так и должно быть655.67
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_DOWN
# использовать для округления чисел с плавающей запятойDecimal(str(655.665)).quantize(Decimal('1.11'), rounding=ROUND_HALF_UP)
# Проблемы и ограничения при использовании чисел с плавающей запятойФорматирование работает правильно даже без округления:
источник
"{:.1f}".format(n)
'%.5f' % 0.988625
0.98862
Если вы используете модуль Decimal, вы можете выполнить аппроксимацию без использования функции «округления». Вот что я использовал для округления, особенно при написании денежных приложений:
Это вернет десятичное число, равное 16,20.
источник
rounding='ROUND_UP'
NameError: global name 'ROUND_UP' is not defined
необходимо импортировать округление функции:from decimal import Decimal, ROUND_UP
. Другие функции округленияround(5.59, 1)
работает нормально. Проблема в том, что 5.6 нельзя точно представить в двоичной системе с плавающей запятой.Как говорит Винко, вы можете использовать форматирование строк для округления при отображении.
В Python есть модуль для десятичной арифметики, если он вам нужен.
источник
Вы получите «5,6», если сделаете это,
str(round(n, 1))
а не простоround(n, 1)
.источник
Вы можете переключить тип данных на целое число:
Затем отобразите число, вставив десятичный разделитель языкового стандарта.
Однако ответ Джимми лучше.
источник
Математика с плавающей запятой уязвима для небольших, но досадных неточностей. Если вы можете работать с целыми числами или фиксированной точкой, вам будет гарантирована точность.
источник
Взгляните на модуль Decimal
и
Decimal предоставляет такие операции, которые позволяют легко писать приложения, требующие операций с плавающей запятой и также должны представлять эти результаты в удобочитаемом формате, например, бухгалтерский учет.
источник
printf присоска.
источник
Это действительно большая проблема. Попробуйте этот код:
Он отображает 4.85. Затем вы делаете:
и показывает 4.8. Вы подсчитываете вручную, точный ответ - 4,85, но если вы попробуете:
вы можете видеть истину: точка с плавающей запятой хранится как ближайшая конечная сумма дробей, знаменатели которой являются степенями двойки.
источник
Вы можете использовать оператор строкового формата
%
, аналогичный sprintf.источник
Отлично работает
источник
Я делаю:
В этом случае мы сначала правильно округляем на уровне единиц, а затем конвертируем в целое число, чтобы избежать печати числа с плавающей запятой.
так
Я думаю, что этот ответ работает лучше, чем формирование строки, и мне также удобнее использовать круглую функцию.
источник
Я бы вообще не стал полагаться
round()
в этом случае. Рассматриватьвыведет
что не является желаемым результатом, если вам нужно твердое округление до ближайшего целого числа. Чтобы обойти это поведение, используйте
math.ceil()
(или,math.floor()
если вы хотите округлить):выходы
Надеюсь, это поможет.
источник
Код:
Вывод:
источник
Вот где я вижу неудачу раунда. Что, если вы захотите округлить эти 2 числа до одного десятичного знака? 23,45 23,55 Мое образование заключалось в том, что округляя их, вы должны получить: 23,4 23,6 «правило» состоит в том, что вы должны округлять в большую сторону, если предыдущее число было нечетным, а не в большую, если предыдущее число было четным. Функция round в Python просто обрезает 5.
источник
Проблема только в том, что последняя цифра равна 5. Например. 0,045 хранится внутри как 0,044999999999999 ... Вы можете просто увеличить последнюю цифру до 6 и округлить. Это даст вам желаемый результат.
источник
Другой возможный вариант:
источник
Что о:
источник
epsilon = .000001
тогдаround(1.0/5.0, 1) + epsilon
взять точное представление 0,2 и сделать его 0,00001. Не менее серьезные проблемы возникли бы, если бы эпсилон находился внутри функции round.