Я только что перечитал Что нового в Python 3.0 и в нем говорится:
Функция округления () и стратегия возврата изменены. Точные полпути теперь округляются до ближайшего четного результата, а не от нуля. (Например, раунд (2.5) теперь возвращает 2, а не 3.)
и документация для тура :
Для встроенных типов, поддерживающих round (), значения округляются до ближайшего кратного 10 к степени минус n; если два множителя одинаково близки, округление выполняется до четного выбора
Итак, под v2.7.3 :
In [85]: round(2.5)
Out[85]: 3.0
In [86]: round(3.5)
Out[86]: 4.0
как я и ожидал. Однако теперь под v3.2.3 :
In [32]: round(2.5)
Out[32]: 2
In [33]: round(3.5)
Out[33]: 4
Это кажется нелогичным и противоречит тому, что я понимаю о округлении (и обманываю людей). Английский не является моим родным языком, но пока я не прочитал это, я думал, что знаю, что означает округление: - / Я уверен, что во время введения v3, должно быть, было некоторое обсуждение этого, но я не смог найти вескую причину в мой поиск.
- Кто-нибудь знает, почему это было изменено на это?
- Существуют ли другие основные языки программирования (например, C, C ++, Java, Perl, ...), которые делают такое (для меня непоследовательное) округление?
Что мне здесь не хватает?
ОБНОВЛЕНИЕ: @ Li-aungYip комментарий о «округлении банкира» дал мне правильный поисковый запрос / ключевые слова для поиска, и я нашел такой SO вопрос: Почему .NET использует округление банкира по умолчанию? так что я буду внимательно это читать.
источник
Ответы:
В наши дни Python 3.0 считается стандартным методом округления, хотя некоторые языковые реализации пока не работают.
Простая техника «всегда вокруг 0,5 вверх» приводит к небольшому смещению в сторону большего числа. При большом количестве вычислений это может быть значительным. Подход Python 3.0 устраняет эту проблему.
Существует более одного метода округления в общем использовании. IEEE 754, международный стандарт математики с плавающей запятой, определяет пять различных методов округления (по умолчанию используется Python 3.0). И есть другие.
Такое поведение не так широко известно, как должно быть. AppleScript был, если я правильно помню, одним из первых, кто применил этот метод округления. Команда
round
в AppleScript на самом деле предлагает несколько вариантов, но по умолчанию используется округление к четному, как в IEEE 754. Очевидно, что инженеру, который реализовалround
команду, надоели все запросы, чтобы «заставить ее работать, как я узнал в школа ", которую он реализовал именно так:round 2.5 rounding as taught in school
это действительная команда AppleScript. :-)источник
3
за2.5.round
Вы можете контролировать округление в Py3000, используя модуль Decimal :
источник
ROUND_HALF_UP
такая же, как старое поведение Python 2.X.setcontext()
функцию.quantize(decimal.Decimal('1')
на,quantize(decimal.Decimal('0.00')
если хотите округлить до ближайших 100, например, за деньги.round(number, ndigits)
до тех пор, покаndigits
оно положительное, но, к сожалению, вы не можете использовать его для замены чего-то подобногоround(5, -1)
.Просто добавлю сюда важное примечание из документации:
https://docs.python.org/dev/library/functions.html#round
Так что не удивляйтесь, если получите следующие результаты в Python 3.2:
источник
2.675
точно представлять : самый близкий компьютер может быть получен2.67499999999999982236431605997495353221893310546875
. Это довольно близко, но это не точно равно2.675
: это очень немного ближе ,2.67
чем2.68
. Таким образом,round
функция делает правильные вещи и округляет ее до более близкого значения, состоящего из двух цифр после точки, а именно2.67
. Это не имеет ничего общего с Python, и все, что связано с двоичной плавающей запятой.У меня недавно тоже были проблемы с этим. Поэтому я разработал модуль python 3, который имеет 2 функции trueround () и trueround_precision (), которые решают эту проблему и дают то же поведение при округлении, которое использовалось в начальной школе (не округление банкиров). Вот модуль. Просто сохраните код и скопируйте его или импортируйте. Примечание: модуль trueround_precision может изменять поведение округления в зависимости от потребностей в соответствии с флагами ROUND_CEILING, ROUND_DOWN, ROUND_FLOOR, ROUND_HALF_DOWN, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_UP и ROUND_05UP в десятичном модуле (см. Дополнительную информацию в документации для модулей). Для функций ниже, смотрите строки документации или используйте help (trueround) и help (trueround_precision), если они скопированы в интерпретатор для дальнейшей документации.
Надеюсь это поможет,
Narnie
источник
Python 3.x округляет .5 значений до соседа, который является четным
однако, можно изменить десятичное округление «назад», чтобы всегда округлять .5 вверх, если это необходимо:
источник
Поведение округления в Python 2 в Python 3.
Добавляем 1 на 15 десятичных знаков. Точность до 15 цифр.
источник
2.675
есть2.67499999999999982236431605997495353221893310546875
. Добавление 1e-15 перевернет его на 2.675 и получит правильное округление. если дробь уже превышает константу кода, добавление 1e-15 ничего не изменит для округления.Некоторые случаи:
Для исправления:
Если вы хотите больше десятичных знаков, например 4, вы должны добавить (+ 0,0000001).
Работа для меня
источник
Образец репродукции:
API: https://docs.python.org/3/library/functions.html#round
Состояния:
Учитывая это понимание, вы можете использовать математику, чтобы решить его
теперь вы можете запустить тот же тест с my_round вместо round.
источник
Самый простой способ округления в Python 3.x, как преподается в школе, - это использование вспомогательной переменной:
И это будут результаты серии от 2,0 до 3,0 (с шагом 0,1):
источник
Вы можете контролировать округление, используя модуль math.ceil:
источник
Попробуйте этот код:
Результатом будет:
Выход вы можете проверить здесь: https://i.stack.imgur.com/QQUkS.png
источник