- Округление в python
- Банковское округление в round()
- Материалы по теме:
- Как оставить несколько знаков после запятой, а остальные отбросить?
- 6 методов для обработки и установки точности в Python
- Различные методы обеспечения точности
- Управление десятичной частью
- Заключение
- Round Python. Округление
- Введение в тему
- Встроенные функции
- Round
Округление в python
Округление в python осуществляется функцией round(number, ndigits) , где number — округляемое число, а ndigits — количество знаков после запятой. Например:
Иногда округление может дать неожиданный результат, например:
round(2.45, 2) # = 2.5 round(2.55, 2) # = 2.5, а не 2.6!
Это связано с неточностью представления типа float (см. Арифметика с плавающей точкой). Так как в компьютере числа записываются в двоичном виде, то приблизительно можно посмотреть, как хранятся числа 2.45 и 2.55, с помощью строкового представления чисел в python. Выведем данные числа с точностью до 30 знаков после запятой:
>>> '%0.30f' % 2.45 '2.450000000000000177635683940025' >>> '%0.30f' % 2.55 '2.549999999999999822364316059975'
Как видите, округляя значение 2.549999999999999822364316059975 до 1 знака после запятой, по правилам арифметического округления получим 2.5
Замечание
Имейте ввиду, что в python 3 (в отличии от python 2) используется банковское округление (что это см. ниже в разделе «Банковское округление в round()»).
В python округление до верха (в большую сторону) math.ceil(x) , а округление до низа (в меньшую сторону) math.floor(x) , например:
import math math.ceil(2.3) # = 3.0 - округление до верха math.floor(2.7) # = 2.0 - округление до низа
Чтобы получить целое число, нужно просто привести полученный результат в int:
round(2.6) # = 3.0 int(round(2.6)) # = 3
Чтобы просто отбросить знаки после запятой, можно сделать так:
int(2.6) # = 2 , что эквивалентно int(math.floor(2.6))
Банковское округление в round()
Очень много идёт дискуссий (pythonworld, stackoverflow, форум linux.org.ru и др.) на тему, какое же всё-таки округление в python арифметическое или банковское (по другому ещё называют Гауссово округление)?
Оказывается в python 2 используется арифметическое округление, а в python 3 — банковское! Спасибо Дмитрию, внёсшему ясность в комментариях, по какому правилу идёт округление в разных python, благодаря подробному примеру и указанию на авторитетный источник.
Банковское (или бухгалтерское) округление позволяет уменьшить погрешности при работе с большим массивом данных. Обычное (или арифметическое) округление даёт нарастающую погрешность из-за того, что для округления в меньшую сторону на конце должны быть цифры: 1, 2, 3, 4 — всего 4 цифр, а в большую: 5, 6, 7, 8, 9 — всего 5 цифр. Неравное количество цифр при большом количестве вычислений и вызывают нарастающую погрешность.
При банковском округлении осуществляется округление к ближайшему чётному, то есть 2,5 → 2 , 3,5 → 4 . Таким образом вероятность того, что перед пятёркой окажется чётное или нечётное число для большинства случаев (к примеру, бухгалтерские расчёты) примерно одинаковая, поэтому такой принцип уменьшает погрешность.
Здесь вы можете увидеть подробности округления в официальных источниках документации python:
Обратите внимание, что документации разных версий python отличаются, а точнее в python 3 добавлено:
For the built-in types supporting round(), values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice (so, for example, both round(0.5) and round(-0.5) are 0, and round(1.5) is 2).
«if two multiples are equally close, rounding is done toward the even choice» (перев.: Округление делается до ближайшего четного) — это и есть банковское округление.
Но напоследок приведу пример, наглядно демонстрирующий разницу работы функции round() в различных версиях python и с учётом неточности представления типа float :
Пример | round() в python 2 | round() в python 3 | банковское округление |
---|---|---|---|
round(2.05, 1) | 2.0 | 2.0 | 2.0 |
round(2.15, 1) | 2.1 | 2.1 | 2.2 |
round(2.25, 1) | 2.3 | 2.2 | 2.2 |
round(2.35, 1) | 2.4 | 2.4 | 2.4 |
round(2.45, 1) | 2.5 | 2.5 | 2.4 |
round(2.55, 1) | 2.5 | 2.5 | 2.6 |
round(2.65, 1) | 2.6 | 2.6 | 2.6 |
round(2.75, 1) | 2.8 | 2.8 | 2.8 |
round(2.85, 1) | 2.9 | 2.9 | 2.8 |
round(2.95, 1) | 3.0 | 3.0 | 3.0 |
Жирным выделил отличающиеся значения выполнения функции round().
Казалось бы в примере с round(2.15, 1) результат для python 3 должен быть 2.2 , потому как python 3 работает по банковскому округлению, но правильное значение 2.1 , так как значение 2.1 в машинном представлении не точное и выглядит для, к примеру, 60 знаков после запятой следующим образом:
>>> '%0.60f' % 2.15 '2.149999999999999911182158029987476766109466552734375000000000'
Отсюда видно, что по правилам обычного арифметического округления получаем 2.1 .
Но для примера round(2.25, 1) 60 знаков после запятой выглядят следующим образом:
>>> '%0.60f' % 2.25 '2.250000000000000000000000000000000000000000000000000000000000'
Вот здесь-то и возникает спорный момент по способу округления. Так для python 2 получаем 2.3 — арифметическое округление.
А для python 3 получаем 2.2 , что соответствует правилам банковского округления.
Материалы по теме:
Как оставить несколько знаков после запятой, а остальные отбросить?
Несколько сотен знаков после запятой у числа ПИ
Добрый день! Несколько дней пролшло с начала работы в Matlab. Предложили реализовать процедуру.
Как отбросить лишние знаки после запятой внутри формулы
Здравствуйте! В общем нужно отбросить лишние знаки после запятой после вычислений, но через.
Отбросить знаки после запятой
есть код: import numpy a = numpy.random.uniform(-80, 100, size=(10,10)) print(a) b, c = , .
Как ограничить количество вводимых знаков в Edit после запятой, не ограничивая количество до запятой?
Доброго времени суток! Подскажите как реализовать так, чтобы после ввода в поле Edit запятой.
n=4.3576 n=str(n) dot=n.index('.') print(f'Число обработанное' ) #либо n=4.3576 rnd=lambda n,koef:(n*(10**koef)//1)/10**koef print(f'Число обработанное ')
А сорри вам же надо без округления. тогда round и не подойдет.
Не могу придумать пример, когда может потребоваться откинуть значащие цифры в числе, а не округлить. Даже ‘%.2f’ % n , что в привели, оказывается округляет.
Добавлено через 28 секунд
откинуть значащие цифры = значит, потерять в точности. Нет смысла.
Отбросить знаки после запятой до двух разрядов
Убрать лишние знаки после запятой, не визуализацию в ячейке, а вообще их откинуть.. 1.999 >> 1.9
Как ограничить количество знаков после запятой, не ограничивая количество до запятой?
Как ограничить количество знаков после запятой, не ограничивая количество до запятой? Если, к.
Отбросить знаки после запятой и вывести в ячейку Excel
ActiveCell.Value = Round(zenazaod, 2) MsgBox (Round(zenazaod, 2)) Первая строка должна вывести.
Visual Basic 2013 сложение чисел, округление до 2 знаков после запятой, отбрасывание знаков
Как сложить несколько чисел из TextBox, округлить их, отбросить знаки после запятой? показать.
Как ограничить число знаков после запятой?
надо ограничить число знаков до 4-х после запятой. В x. вот программа, а вівод x конечно в конце: .
Как ограничить количество знаков после запятой?
возникли сложности в том что в ответе в форме Picture4.Print arifmeticheskoe_index не знаю как.
6 методов для обработки и установки точности в Python
Python предоставляет множество встроенных методов для обработки точных значений чисел с плавающей запятой. В этом руководстве мы обсудим наиболее распространенные типы методов для обработки и установки точности в Python. Большинство методов определены в математическом модуле.
Различные методы обеспечения точности
Следующие методы поставляются с математическим модулем.
- trunc() – метод trunc() удаляет все десятичные точки из числа с плавающей запятой. Он возвращает целочисленное значение без десятичной части.
- ceil() – этот метод печатает наименьшее целое число, большее заданного числа.
- floor() – этот метод печатает наибольшее целое число, меньшее целого.
Давайте разберемся в следующем примере.
import math num = 25.74356801 # using trunc() function print("The value is:",math.trunc(num)) # using ceil() function print("The ceiling value is:",math.ceil(num)) # using floor() function print("The floor value is:", math.floor(num))
The value is: 25 The ceiling value is: 26 The floor value is: 25
Управление десятичной частью
В предыдущем примере мы увидели, как можно удалить дробную часть числа. Теперь мы научимся управлять десятичной частью. Во-первых, давайте разберемся в следующих методах.
- Оператор% – он работает как printf в C и используется для установки точности и формата. Мы можем настроить пределы точности, которые будут включены в результирующее число.
- format() – это встроенный метод Python, который используется для форматирования строки и установки точности.
- round(n, d) – используется для округления числа n до d десятичных знаков. Мы можем выбрать количество цифр, которое может отображаться после десятичных знаков.
num = 25.73796211 # using "%" operator print('The value is: %.3f'%num) # using format() function print("The value is: ".format(num)) # using round() function print("The value is:",round(num,5))
The value is: 25.738 The value is: 25.738 The value is: 25.73796
Заключение
Мы обсудили шесть методов обработки точности в Python. Все методы просты в использовании и дают точный результат.
Round Python. Округление
Основы
Введение в тему
Зачастую при вычислениях, а их в работе программиста не мало, мы сталкиваемся с задачами округления. Округлять можно по разному: вверх, вниз и с разной степенью точности. В языке Пайтон для выполнения этого класса задач предусмотрено несколько доступных инструментов: функции round(), int(), а так же модуль math. Но, есть и подводные камни. Обо всём этом Вы узнаете из данного урока.
Встроенные функции
Начнём с рассмотрения встроенных функций: round и int. Что означает «встроенные»? Всё просто: чтобы их использовать не надо ничего подключать или импортировать – просто пишете имя функции и она уже готова к бою.
Round
Функция round – округляет число до необходимой точности (заданного количества знаков после запятой).
Точность является не обязательным параметром и, если её не задать, то Python округлит число, указанное в скобках, до ближайшего целого числа:
результат_округления = round(3.14) print(результат_округления) # Вывод: 3 результат_округления = round(3.94) print(результат_округления) # Вывод: 4 import math результат_округления = round(math.pi, 5) print(результат_округления) # Вывод: 3.14159Со школы многие привыкли, что, когда (N + 1) знак = 5, а последующие знаки равны нулю, округление производится всегда в большую по модулю сторону.
Если дробная часть равна 0,5, то результатом округления будет ближайшее четное число.
При округлении функцией round(), можно получить следующее: