Дилемма округления до половины числа с плавающей запятой
Сталкиваетесь со странностью в функции round()? Обратите внимание на следующее поведение:
for i in range(1, 15, 2): n = i / 2 print(n, "=>", round(n))
Можно было ожидать, что плавающие значения будут последовательно округляться в большую сторону, однако они неожиданно округляются до ближайшего четного числа.
Причина поведения
Документация числовых типов поясняет это своеобразное поведение с помощью утверждения «round(x[, n]) x округлено до n цифр, округление половины до даже." Это известно как банкирское округление. Вместо постоянного округления в большую или меньшую сторону, которое приводит к увеличению ошибок округления, банковское округление компенсирует это, ориентируясь на ближайшее четное число.
Решение для контролируемого округления
Для точного округления , используйте десятичный модуль. Этот модуль предоставляет вам возможность указать конкретные стратегии округления. Например, чтобы округлить половину в большую сторону:
>>> from decimal import localcontext, Decimal, ROUND_HALF_UP >>> with localcontext() as ctx: ... ctx.rounding = ROUND_HALF_UP ... for i in range(1, 15, 2): ... n = Decimal(i) / 2 ... print(n, '=>', n.to_integral_value()) ... 0.5 => 1 1.5 => 2 2.5 => 3 3.5 => 4 4.5 => 5 5.5 => 6 6.5 => 7
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3