JavaRush /Курсы /Модуль 1: Python Core /Работа с вещественными числами

Работа с вещественными числами

Модуль 1: Python Core
4 уровень , 3 лекция
Открыта

4.1 Округление вещественных чисел

Вещественные (дробные) числа по-английски называются floating point number — числа с плавающей точкой: в США для разделения целой и дробной части числа используется точка. Отсюда и происходит название float.

Как мы уже разбирали, при преобразовании вещественного числа (float) в целое (int), оно всегда округляется вниз до целого — его дробная часть просто отбрасывается. А ведь легко можно представить ситуацию, когда дробное число нужно округлить просто до ближайшего целого. Что делать в такой ситуации?

Для этого в Python есть встроенная функция round(). Она была придумана еще до создания библиотеки math, поэтому не входит в нее. Функции для округления вниз и округления вверх находятся в библиотеке math.

Функция round() округляет число до ближайшего целого:


round(вещественное_число)

Данная функция вернет целое число, к которому ближе переданное в нее вещественное число. Важно отметить, что если дробная часть числа равна 0.5, функция round() использует метод округления до ближайшего четного целого числа. Это называется "банковским округлением" и позволяет уменьшить систематическую ошибку при многократном округлении. Например:

Примеры:

Команда Результат
x = round(4.1) 4
x = round(4.5) 4
x = round(4.9) 5
x = round(5.5) 6
Функция math.ceil() округляет число до целого вверх, примеры:

Команда Результат
x = math.ceil(4.1) 5
x = math.ceil(4.5) 5
x = math.ceil(4.9) 5

Функция math.floor() округляет число до целого вниз, примеры:

Команда Результат
x = math.floor(4.1) 4
x = math.floor(4.5) 4
x = math.floor(4.9) 4

Хотя для округления числа до целого вниз проще использовать функцию преобразования типов int():

Команда Результат
x = int(4.9) 4

Если вам сложно запомнить эти команды, поможет небольшой урок английского:

  • math — математика
  • round — круг/округлять
  • ceiling — потолок
  • floor — пол

4.2 Устройство чисел с плавающей точкой

Тип float в Python может хранить значения в диапазоне -1.7*10308 до +1.7*10308. Такой гигантский диапазон значений объясняется тем, что тип float устроен совсем иначе по сравнению с целыми типами. Каждая переменная типа float содержит два числа: первое называется мантисса, а второе — степень.

Допустим, у нас есть число 123456789, и мы сохранили его в переменную типа float. Тогда число будет преобразовано к виду 1.23456789*108, и внутри типа float будут хранится два числа — 23456789 и 8. Красным выделена «значащая часть числа» (манти́сса), зелёным — степень.

Такой подход позволяет хранить как очень большие числа, так и очень маленькие. Но поскольку размер числа ограничен 8 байтами (64 бита) и часть бит используется под хранение степени (а также знака числа и знака степени), максимальная длина мантиссы ограничена 15 цифрами.

Это очень упрощенное описание устройства вещественных чисел, более полное можно загуглить.

4.3 Потеря точности при работе с вещественными числами

При работе с вещественными числами всегда нужно иметь в виду, что вещественные числа — неточные. Всегда будут ошибки округления, ошибки преобразования из десятичной системы в двоичную и, наконец, самое частое — потеря точности при сложении/вычитании чисел слишком разных размерностей.

Последнее — самая неожиданная ситуация для новичков в программировании.

Если из числа 109 вычесть 1/109, мы получим опять 109.

Вычитание чисел слишком разных размерностей Объяснение

1000000000.000000000
   -     0.000000001
1000000000.000000000
                            
Второе число слишком маленькое, и его значащая часть игнорируется (выделено серым). Красным выделены 15 значащих цифр.

Что тут сказать, программирование — это не математика.

4.4 Опасность сравнения вещественных чисел

Еще одна опасность подстерегает программистов при сравнении вещественных чисел. Поскольку при работе с этими числами могут накапливаться ошибки округления, то возможны ситуации, когда вещественные числа должны быть равны, но они не равны. И наоборот: числа должны быть не равны, но они равны.

Пример:

Команда Пояснение
a = 1000000000.0 b = 0.000000001 c = a – b

В переменной a будет значение 1000000000.0

В переменной c будет значение 1000000000.0

(число в переменной b слишком маленькое)

В приведенном выше примере a и c не должны быть равны, но они равны.

Или возьмем другой пример:

Команда Пояснение
a = 1.00000000000000001 b = 1.00000000000000002

В переменной a будет значение 1.0

В переменной b будет значение 1.0

На практике вещественные числа сравнивают так:

Берется какое-то очень маленькое число. Если разница чисел (по модулю) меньше, чем это маленькое число, то они считаются равными. Пример:


a = 0.00000000012
b = 0.000000000011 

if abs(a - b) < 0.00001:
    print("равны")
else:
    print("не равны")
2
Задача
Модуль 1: Python Core, 4 уровень, 3 лекция
Недоступна
Круглый математик
Круглый математик
2
Задача
Модуль 1: Python Core, 4 уровень, 3 лекция
Недоступна
Сравнивать очень просто
Сравнивать очень просто
Комментарии (20)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
EvgenyXIV Уровень 31
7 марта 2026
на вс.случай поправочка, если про округление речь (+ опечатка в тексте) Тип float в Python может хранить значения в диапазоне -1.7*10308 до +1.7*10308 = =Тип float в Python может хранить значения в диапазоне -1.798*10**308 до +1.798*10**308 Кроме того, по абсолютной величине минимальное число типа float 2,225*10**(-308)
Виктория Уровень 7
2 марта 2026
В лекции сказано "берется какое-то очень маленькое число". В задаче уже звучит "допустимая погрешность epsilon". Почему и очень маленькое число и epsilon приравниваются к 0,00001. Или можно взять другое число, например 0,0001 или 0,000001.
EvgenyXIV Уровень 31
7 марта 2026
epsilon на Ваш выбор - у меня "прокатило" epsilon = 0.00000001
Максим Данилов Уровень 2 Expert
8 февраля 2026
Согласен с тем, что задача "Сравнивать очень просто" неудачная. Решение совсем не очевидное, информации из темы не достаточно.
EvgenyXIV Уровень 31
7 марта 2026
не согласен. 8-го класса + лекции хватает ))
Oleg Fedoruk Уровень 6
26 августа 2025
зачем ограничивать тестами до переменной с названием number? от смены имени переменных вывод не меняется
Владимир Уровень 91
17 марта 2025
На самом деле решение этой задачи есть в лекции (перечитайте внимательно): num_1 = float(input("Введите первое вещественное число: ")) num_2 = float(input("Введите второе вещественное число: ")) epsilon = 0.00001 if abs(num_1 - num_2) < epsilon: print("Равны") else: print("Не равны")
8 февраля 2025
размер float - 1.7 * 10 в степени 308
Simona Hub Уровень 11
12 января 2025
Разница в результате между round(4.5) и round(5.5) заключается в том, что Python применяет правило округления к ближайшему четному числу, и это правило зависит от целого числа, к которому округляется: Для 4.5: Ближайшие целые числа: 4 (четное) и 5 (нечетное). Поскольку 4 — четное, round(4.5) округляется до 4. Для 5.5: Ближайшие целые числа: 5 (нечетное) и 6 (четное). Поскольку 6 — четное, round(5.5) округляется до 6. то есть 4.5 тут ближайшее четное 4 а в 5.5 ближайшее четное будет 6 Ну что бы жизнь легкой не казалась ))
Ольга Уровень 29
30 сентября 2025
интересное пояснение, спасибо. даже в голову бы не пришло)))
Zavarkin Уровень 6
9 января 2025
Задача "Сравнивать очень просто" написана крайне плохо. Использованы функции, описания которых не было в лекции, так же не понятно без подсказок как именно нужно написать код. Функция abs_tol вообще не известна...
Андрей Уровень 10
9 января 2025
я один не понимаю, почему x = round(4.5) это 4 а x = round(5.5) это 6? Это не опечатка в лекции, а так действительно происходит, если запустить
Optimus Уровень 7
16 января 2025
В лекции написано, что до ближайшего целого ЧЕТНОГО.
Denis Уровень 2
6 января 2025
где вообще сказано, что такое epsilon с помощью которого нужно решить задачу?
Dmitry Ryabov Уровень 23
19 января 2025
epsilon Вы задаёте сами, это будет значение Вашей точности сравнения вещественных чисел