0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>13 мар 2024</li>
2
<ul><li>13 мар 2024</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Отсекаем хвосты числовым змеям без потерь в точности.</p>
4
</ul><p>Отсекаем хвосты числовым змеям без потерь в точности.</p>
5
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
5
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
6
<p>Автор статей о программировании, технологиях и гаджетах. Пишет код на JavaScript и Python. Любит веб-технологии, модные приложения и магию Apple.</p>
6
<p>Автор статей о программировании, технологиях и гаджетах. Пишет код на JavaScript и Python. Любит веб-технологии, модные приложения и магию Apple.</p>
7
<p>Когда работаешь с десятичными дробями в коде, часто получаются монструозные числа с кучей знаков после запятой. В этой статье научимся сокращать значения так, чтобы не потерять в точности и не внести погрешности.</p>
7
<p>Когда работаешь с десятичными дробями в коде, часто получаются монструозные числа с кучей знаков после запятой. В этой статье научимся сокращать значения так, чтобы не потерять в точности и не внести погрешности.</p>
8
<p><strong>6 способов округления в Python</strong></p>
8
<p><strong>6 способов округления в Python</strong></p>
9
<ul><li><a>Функция round() - стандартный способ</a></li>
9
<ul><li><a>Функция round() - стандартный способ</a></li>
10
<li><a>Функция int() - быстрый и грубый способ</a></li>
10
<li><a>Функция int() - быстрый и грубый способ</a></li>
11
<li><a>Модуль math - когда важна точность</a></li>
11
<li><a>Модуль math - когда важна точность</a></li>
12
</ul><ul><li><a>math.ceil</a></li>
12
</ul><ul><li><a>math.ceil</a></li>
13
<li><a>math.floor</a></li>
13
<li><a>math.floor</a></li>
14
<li><a>math.trunc</a></li>
14
<li><a>math.trunc</a></li>
15
</ul><ul><li><a> Модуль decimal - ещё больше точности</a></li>
15
</ul><ul><li><a> Модуль decimal - ещё больше точности</a></li>
16
</ul><p>В Python есть встроенная функция для округления чисел. В общем виде она выглядит так: round(number, digits). В качестве первого аргумента (number) передаём дробное число, а во втором (digits) указываем количество чисел после запятой. Второй аргумент по умолчанию равен нулю.</p>
16
</ul><p>В Python есть встроенная функция для округления чисел. В общем виде она выглядит так: round(number, digits). В качестве первого аргумента (number) передаём дробное число, а во втором (digits) указываем количество чисел после запятой. Второй аргумент по умолчанию равен нулю.</p>
17
round(6.4457, 2) # 6,45<p>Важно отметить, что алгоритм вычисления функции round() различается в разных версиях языка. В Python 2 за основу взяты классические правила арифметики. То есть 1, 2, 3, 4 после запятой ведут к округлению в меньшую сторону, а 5, 6, 7, 8, и 9 - в большую.</p>
17
round(6.4457, 2) # 6,45<p>Важно отметить, что алгоритм вычисления функции round() различается в разных версиях языка. В Python 2 за основу взяты классические правила арифметики. То есть 1, 2, 3, 4 после запятой ведут к округлению в меньшую сторону, а 5, 6, 7, 8, и 9 - в большую.</p>
18
<p>Например:</p>
18
<p>Например:</p>
19
<ul><li>7,6 → 8 - округление в большую сторону.</li>
19
<ul><li>7,6 → 8 - округление в большую сторону.</li>
20
<li>7,4 → 7 - округление в меньшую сторону.</li>
20
<li>7,4 → 7 - округление в меньшую сторону.</li>
21
</ul><p>В Python 3 используется так называемый "банковский" метод, то есть округление до ближайшего чётного числа:</p>
21
</ul><p>В Python 3 используется так называемый "банковский" метод, то есть округление до ближайшего чётного числа:</p>
22
<ul><li>3,5 → 4.</li>
22
<ul><li>3,5 → 4.</li>
23
<li>6,5 → 6.</li>
23
<li>6,5 → 6.</li>
24
</ul><p>В этой статье мы будем использовать Python 3. Вот как работает округление в этой версии с помощью функции round():</p>
24
</ul><p>В этой статье мы будем использовать Python 3. Вот как работает округление в этой версии с помощью функции round():</p>
25
round(7) # 7 round(7.5) # 8 round(7.56986, 2) # 7.57<p>Видно, что round() привела число к ближайшему чётному, и число 7,5 округлилось до 8. В последнем случае мы задали точность вычислений и оставили только два знака после запятой. С отрицательными числами всё работает так же:</p>
25
round(7) # 7 round(7.5) # 8 round(7.56986, 2) # 7.57<p>Видно, что round() привела число к ближайшему чётному, и число 7,5 округлилось до 8. В последнем случае мы задали точность вычислений и оставили только два знака после запятой. С отрицательными числами всё работает так же:</p>
26
round(-7) # -7 round(-7.5) # -8 round(-7.56986, 2) # -7.57<p>Чтобы получить целое значение, функция round() приводит результат к типу int. Именно поэтому 7,7 превращается в 8, а не в 8,0.</p>
26
round(-7) # -7 round(-7.5) # -8 round(-7.56986, 2) # -7.57<p>Чтобы получить целое значение, функция round() приводит результат к типу int. Именно поэтому 7,7 превращается в 8, а не в 8,0.</p>
27
<p>Есть и более быстрый способ округлить число в Python - полностью отбросить дробную часть. Чтобы это сделать, надо привести дробное число к целому с помощью встроенной функции int(). Такой способ работает безотказно и не требует импорта дополнительных модулей. Посмотрим на примеры:</p>
27
<p>Есть и более быстрый способ округлить число в Python - полностью отбросить дробную часть. Чтобы это сделать, надо привести дробное число к целому с помощью встроенной функции int(). Такой способ работает безотказно и не требует импорта дополнительных модулей. Посмотрим на примеры:</p>
28
int(7.1) # 7 int(7.9) # 7 int(7.899) # 7<p>Во всех примерах выше мы получаем число 7 после округления. Теперь провернём то же самое, но для отрицательных значений:</p>
28
int(7.1) # 7 int(7.9) # 7 int(7.899) # 7<p>Во всех примерах выше мы получаем число 7 после округления. Теперь провернём то же самое, но для отрицательных значений:</p>
29
int(-7.1) # -7 int(-7.9) # -7 int(-7.899) # -7<p>Ничего не поменялось, и Python всё равно отбрасывает всё, что находится после запятой. Это очень грубый подход, который противоречит правилам арифметического округления. Но можно добавить точности с помощью простого условия: прибавим к числу 0,5, если оно больше нуля, а если меньше - -0,5:</p>
29
int(-7.1) # -7 int(-7.9) # -7 int(-7.899) # -7<p>Ничего не поменялось, и Python всё равно отбрасывает всё, что находится после запятой. Это очень грубый подход, который противоречит правилам арифметического округления. Но можно добавить точности с помощью простого условия: прибавим к числу 0,5, если оно больше нуля, а если меньше - -0,5:</p>
30
def correct_rounding(number): if number > 0: return int(number + 0.5) else: return int(number + -0.5) correct_rounding(7.1) # 7 correct_rounding(7.7) # 8 correct_rounding(-7.1) # -7 correct_rounding(-7.7) # -8<p>В этом случае округление будет работать правильно, но нам пришлось написать дополнительную функцию. В Python есть более быстрые и удобные способы.</p>
30
def correct_rounding(number): if number > 0: return int(number + 0.5) else: return int(number + -0.5) correct_rounding(7.1) # 7 correct_rounding(7.7) # 8 correct_rounding(-7.1) # -7 correct_rounding(-7.7) # -8<p>В этом случае округление будет работать правильно, но нам пришлось написать дополнительную функцию. В Python есть более быстрые и удобные способы.</p>
31
<p>Если хотите точности без написания дополнительных алгоритмов, можно подключить встроенную в Python библиотеку math. В ней есть функции, которые позволяют округлить число быстро и без программных костылей.</p>
31
<p>Если хотите точности без написания дополнительных алгоритмов, можно подключить встроенную в Python библиотеку math. В ней есть функции, которые позволяют округлить число быстро и без программных костылей.</p>
32
<p>Вот эти функции:</p>
32
<p>Вот эти функции:</p>
33
<ul><li>ceil() - округление в большую сторону;</li>
33
<ul><li>ceil() - округление в большую сторону;</li>
34
<li>floor() - округление в меньшую сторону;</li>
34
<li>floor() - округление в меньшую сторону;</li>
35
<li>trunc() - отбрасывание дробной части.</li>
35
<li>trunc() - отбрасывание дробной части.</li>
36
</ul><p>Дальше мы расскажем о каждой функции подробнее. Но сначала - импортируем модуль math в наш проект. Для этого пропишем команду import math в начале файла. Если пропустить этот шаг, Python просто не поймёт, как ему исполнять эти функции.</p>
36
</ul><p>Дальше мы расскажем о каждой функции подробнее. Но сначала - импортируем модуль math в наш проект. Для этого пропишем команду import math в начале файла. Если пропустить этот шаг, Python просто не поймёт, как ему исполнять эти функции.</p>
37
<p>Функция ceil() округляет результат в большую сторону. Например, число 25,5 находится между 25 и 26, поэтому алгоритм автоматически округлит его до 26:</p>
37
<p>Функция ceil() округляет результат в большую сторону. Например, число 25,5 находится между 25 и 26, поэтому алгоритм автоматически округлит его до 26:</p>
38
import math math.ceil(25.1) # 26 math.ceil(25.5) # 26 math.ceil(25.9) # 26<p>Этот же принцип работает и с отрицательными числами:</p>
38
import math math.ceil(25.1) # 26 math.ceil(25.5) # 26 math.ceil(25.9) # 26<p>Этот же принцип работает и с отрицательными числами:</p>
39
import math math.ceil(-25.1) # -25 math.ceil(-25.5) # -25 math.ceil(-25.9) # -25<p>В Python 3 функция math.ceil возвращает целое число (int), а в Python 2 - число с плавающей точкой (float).</p>
39
import math math.ceil(-25.1) # -25 math.ceil(-25.5) # -25 math.ceil(-25.9) # -25<p>В Python 3 функция math.ceil возвращает целое число (int), а в Python 2 - число с плавающей точкой (float).</p>
40
<p>Для округления в меньшую сторону используют функцию floor(). Принцип её работы идентичен ceil(), только при сравнении Python пойдёт вниз:</p>
40
<p>Для округления в меньшую сторону используют функцию floor(). Принцип её работы идентичен ceil(), только при сравнении Python пойдёт вниз:</p>
41
import math math.floor(25.1) # 25 math.floor(25.5) # 25 math.floor(25.9) # 25<p>Всё то же самое происходит и с отрицательными числами. Python смотрит на соседние целые числа, выбирает, какое из них ближе и округляет до него. В случае с -25 меньшим числом будет -26:</p>
41
import math math.floor(25.1) # 25 math.floor(25.5) # 25 math.floor(25.9) # 25<p>Всё то же самое происходит и с отрицательными числами. Python смотрит на соседние целые числа, выбирает, какое из них ближе и округляет до него. В случае с -25 меньшим числом будет -26:</p>
42
import math math.floor(-25.1) # -26 math.floor(-25.5) # -26 math.floor(-25.9) # -26<p>Эта функция из математического модуля Python просто отбрасывает все числа после запятой, оставляя только целую часть:</p>
42
import math math.floor(-25.1) # -26 math.floor(-25.5) # -26 math.floor(-25.9) # -26<p>Эта функция из математического модуля Python просто отбрасывает все числа после запятой, оставляя только целую часть:</p>
43
import math math.trunc(25.1) math.trunc(25.5) math.trunc(25.9)<p>Это очень похоже на округление с помощью int(). Поэтому, если вам нужен быстрый и грубый способ избавиться от дроби, лучше пользоваться именно ей. Не стоит подключать в проект целый модуль ради одной функции, если, конечно, вы не <a>любитель палить из пушки по воробьям</a>:)</p>
43
import math math.trunc(25.1) math.trunc(25.5) math.trunc(25.9)<p>Это очень похоже на округление с помощью int(). Поэтому, если вам нужен быстрый и грубый способ избавиться от дроби, лучше пользоваться именно ей. Не стоит подключать в проект целый модуль ради одной функции, если, конечно, вы не <a>любитель палить из пушки по воробьям</a>:)</p>
44
<p>Python не всегда точно обрабатывает дробные числа. В этом можно убедиться на простом примере:</p>
44
<p>Python не всегда точно обрабатывает дробные числа. В этом можно убедиться на простом примере:</p>
45
print(0.1 * 3) # 0.30000000000000004<p>Должно получиться 0,3, но вместо этого появилось много нулей после запятой. Так получается из-за перевода десятичных дробей в двоичную систему в памяти компьютера. Эта же особенность иногда приводит к ошибкам при округлении:</p>
45
print(0.1 * 3) # 0.30000000000000004<p>Должно получиться 0,3, но вместо этого появилось много нулей после запятой. Так получается из-за перевода десятичных дробей в двоичную систему в памяти компьютера. Эта же особенность иногда приводит к ошибкам при округлении:</p>
46
round(2.65, 1) # 2.6 round(2.85, 1) # 2.9<p>В первом случае Python округлил в меньшую сторону, а во втором - в большую, хотя в обеих дробях стоит одна и та же пятёрка на конце. Если хотите получать более предсказуемый результат, можно использовать модуль decimal.</p>
46
round(2.65, 1) # 2.6 round(2.85, 1) # 2.9<p>В первом случае Python округлил в меньшую сторону, а во втором - в большую, хотя в обеих дробях стоит одна и та же пятёрка на конце. Если хотите получать более предсказуемый результат, можно использовать модуль decimal.</p>
47
<p>Для начала импортируем модуль командой from decimal import *. После этого создадим объект числа с плавающей точкой с помощью класса Decimal.</p>
47
<p>Для начала импортируем модуль командой from decimal import *. После этого создадим объект числа с плавающей точкой с помощью класса Decimal.</p>
48
<p>Ошибок при вычислении уже не будет:</p>
48
<p>Ошибок при вычислении уже не будет:</p>
49
from decimal import * number = Decimal("0.1") number = number * 3 # 0.3<p>Для округления в Decimal есть метод quantize(). Но, чтобы он нормально работал, ему нужно показать, как именно форматировать число. Для этого передадим ему в качестве аргумента ещё один объект Decimal с числом-шаблоном:</p>
49
from decimal import * number = Decimal("0.1") number = number * 3 # 0.3<p>Для округления в Decimal есть метод quantize(). Но, чтобы он нормально работал, ему нужно показать, как именно форматировать число. Для этого передадим ему в качестве аргумента ещё один объект Decimal с числом-шаблоном:</p>
50
from decimal import * number = Decimal("3.5648575") number = number.quantize(Decimal("1.000")) # 3.565<p>Видим, что число 1.000 показывает алгоритму, сколько именно знаков нужно оставить после запятой.</p>
50
from decimal import * number = Decimal("3.5648575") number = number.quantize(Decimal("1.000")) # 3.565<p>Видим, что число 1.000 показывает алгоритму, сколько именно знаков нужно оставить после запятой.</p>
51
<p>Теперь вернёмся к первому примеру, где метод round() округлял похожие числа по-разному. С помощью Decimal, получим более прогнозируемый результат:</p>
51
<p>Теперь вернёмся к первому примеру, где метод round() округлял похожие числа по-разному. С помощью Decimal, получим более прогнозируемый результат:</p>
52
from decimal import * number = Decimal("2.65") # Округляем сотые до десятых number = number.quantize(Decimal("1.0")) # 2.6 number = Decimal("2.85") number = number.quantize(Decimal("1.0")) # 2.8<p>Если в программе важна высокая точность при округлении чисел, то лучше использовать модуль decimal. Код получится немного сложнее, но это убережёт от получения непредсказуемых результатов и ошибок в подсчётах.</p>
52
from decimal import * number = Decimal("2.65") # Округляем сотые до десятых number = number.quantize(Decimal("1.0")) # 2.6 number = Decimal("2.85") number = number.quantize(Decimal("1.0")) # 2.8<p>Если в программе важна высокая точность при округлении чисел, то лучше использовать модуль decimal. Код получится немного сложнее, но это убережёт от получения непредсказуемых результатов и ошибок в подсчётах.</p>
53
<ul><li>Самый простой способ округления - отбросить дробную часть с помощью метода int(). Однако этот подход довольно грубый и не подходит для решения задач, в которых важна высокая точность.</li>
53
<ul><li>Самый простой способ округления - отбросить дробную часть с помощью метода int(). Однако этот подход довольно грубый и не подходит для решения задач, в которых важна высокая точность.</li>
54
<li>Для округления в Python предусмотрена нативная функция round(), но алгоритм вычислений различается в зависимости от версии языка программирования. С этим надо быть внимательнее.</li>
54
<li>Для округления в Python предусмотрена нативная функция round(), но алгоритм вычислений различается в зависимости от версии языка программирования. С этим надо быть внимательнее.</li>
55
<li>В модуле math содержатся уже готовые функции ceil(), floor() и trunc(). С ними проще работать, а результат получается более предсказуемым.</li>
55
<li>В модуле math содержатся уже готовые функции ceil(), floor() и trunc(). С ними проще работать, а результат получается более предсказуемым.</li>
56
<li>Из-за особенностей компьютерных вычислений Python не всегда точно обрабатывает десятичные дроби. Чтобы избежать связанных с этим ошибок, используйте модуль decimal.</li>
56
<li>Из-за особенностей компьютерных вычислений Python не всегда точно обрабатывает десятичные дроби. Чтобы избежать связанных с этим ошибок, используйте модуль decimal.</li>
57
</ul><p>Python для всех</p>
57
</ul><p>Python для всех</p>
58
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
58
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
59
<p><a>Пройти бесплатно</a></p>
59
<p><a>Пройти бесплатно</a></p>
60
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>
60
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>