Анонимный пользователь
Дополнительно
Ограничение плавающих значений двумя десятичными точками
Я хочу, чтобы a
было округлено до 13.95.
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
Функция round
работает не так, как я ожидал.
1512
20
Вы столкнулись со старой проблемой с числами с плавающей запятой: не все числа могут быть представлены точно. Командная строка просто показывает вам полную форму с плавающей точкой из памяти.
При представлении с плавающей точкой ваша округленная версия - это то же самое число. Поскольку компьютеры двоичные, они хранят числа с плавающей точкой как целое число, а затем делят его на степень двойки, поэтому 13,95 будет представлено так же, как 125650429603636838/(2**53).
Числа двойной точности имеют точность 53 бита (16 цифр), а обычные числа с плавающей точкой имеют точность 24 бита (8 цифр). Для хранения значений используется тип с плавающей точкой в Python использует двойную точность.
Например,
Если вам нужны только два знака после запятой (например, для отображения валютного значения), то у вас есть несколько лучших вариантов:
Существуют новые спецификации формата, String Format Specification Mini-Language:
Вы можете сделать то же самое, что:
Примечание, что вышеприведенное возвращает строку. Для того, чтобы получить число в виде float, просто оберните его с помощью
float(...)
:Примечание, что обертывание с
float()
ничего не меняет:Встроенная функция
round()
отлично работает в Python 2.7 или более поздней версии.Пример:
Посмотрите документацию.
Я чувствую, что самый простой подход-использовать формат
()
функция.Например:
Это создает число с плавающей запятой в строку с точностью до двух знаков после запятой.
Большинство чисел не может быть точно представлено в поплавки. Если вы хотите, чтобы округлить число, потому что's что ваши математические формулы или алгоритма необходимо, то необходимо использовать круглый. Если вы просто хотите ограничить просмотр определенной точностью, а затем Дон'т даже использовать круглые и просто отформатировать его как строку. (Если вы хотите, чтобы отобразить его с какой-то другой способ округления, а есть т, то вам нужно смешать два подхода.)
И наконец, хотя, возможно, самое главное, если вы хотите точное математика тогда вы не'т хотим, чтобы поплавки на всех. Обычным примером является дело с деньгами и в магазине 'копеек' как целое.
Использовать
вместо
Потому что последнее может привести к ошибкам на выходе при попытке вывода нескольких переменных (см. комментарии).
Попробуйте ниже код:
С помощью Python < 3 (например, 2.6 или 2.7), есть два способа сделать это.
Но учтите, что для Python версии выше 3 (например, 3.2 или 3.3), второй вариант - предпочтительным.
Для получения дополнительной информации на второй вариант, я предлагаю эту ссылку на форматирование строк из документации по языку Python.
И для получения дополнительной информации о варианте, по этой ссылке будет достаточно и информации на различные флаги.
Ссылка: https://stackoverflow.com/questions/15263597/convert-floating-point-number-to-certain-precision-then-copy-to-string
Прям ;)
Проблема округления ввода / вывода была решена окончательно с помощью Python 2.7.0 и 3.1.
Правильно округленное число может быть обратимо преобразуется и обратно:
стр -> поплавка() -> предст() -> поплавка (из) ... " или " десятичное -> плавающая> стр -> десятичное
Тип decimal не нужно для хранения.(Естественно, это может быть в результате сложения или вычитания из округленных цифр, чтобы устранить накопленные в прошлом ошибок. Явной десятичной арифметики может быть еще пригодится, но преобразование в строку
(ул.)
(то есть с округлением до 12 действительных чисел) является достаточно как правило, если нет высокой точностью или нет крайний ряд последовательных арифметических операций не требуется.)Бесконечные испытания:
Документация
Смотрите заметки о выпуске для Python 2.7 - другие изменения четвертый пункт:
Проблема
*Дополнительная информация: форматирование "плывет" перед питоном 2.7 был похож на пакете numpy в настоящее время.float64
. Оба типа используют тот же 64-битный [стандарт IEEE 754](https://en.wikipedia.org/wiki/Double-precision_floating-point_format) двойной точности с 52 бита мантиссы. Большая разница заключается в том, что
НП.float64.предстчасто отформатирован с чрезмерным количеством десятичных так что не может быть потеряно, но не действует по стандарту IEEE 754 число существует между 13.949999999999999 и 13.950000000000001. Результат не хороший и преобразование
предст(поплавка(number_as_string)) не обратимых операций с numpy. С другой стороны:поплавок.__предст__
форматируется так, что каждая цифра важна; последовательность без пробелов и преобразование является обратимым. Просто: если вы, возможно, есть и NumPy.float64 число, преобразовать его в обычный поплавок для того, чтобы быть отформатирован для людей, а не для числовых процессоров, в противном случае больше ничего и не надо с Python 2.7+.Вы можете изменить формат вывода:
Вы можете использовать формат оператор округления значения до 2 знаков после запятой в Python:
Здесь, кажется, никто не упоминал об этом, поэтому позвольте мне привести пример в Python 3.6'С Ф-строку/шаблон-строка форматирования, я думаю, красиво аккуратно:
Он хорошо работает с уже слишком примерами, с операторами и не нуждающихся в скобки:
В Python 2.7:
Питон учебник имеет приложение под названием арифметика с плавающей точкой: проблемы и ограничения. Прочитать его. Это объясняет то, что происходит и почему Python делает все возможное. Это был даже пример, который соответствует вашей. Позволю себе процитировать немного:
Одним из альтернативных и решение ваших проблем будет использовать
десятичное число
модуль.Как @Мэтт указал, питон 3.6 обеспечивает Ф-строк, и они могут также использовать вложенный параметров:
который будет отображать результат: 2.35`
Он делает именно то, что вы ему сказали, и работает правильно. Прочитайте больше о floating point confusion и, возможно, попробуйте вместо этого использовать decimal объекты.
Для фиксации плавающей точкой в тип-динамических языков, таких как Python и JavaScript, я использую эту технику
Вы также можете использовать десятичные следующим образом:
Результаты:
Используйте комбинацию десятичных предмет и круглым() метод.