Открыть сервисСервис

Тип float в Python

float — встроенный тип данных в языке программирования Python, представляющий вещественные (дробные) числа с плавающей точкой. Объекты типа float соответствуют двоичным форматам IEEE 754 (binary64) и хранят значение в виде 64-битного числа с двойной точностью: 1 бит на знак, 11 бит на экспоненту и 52 бита на мантиссу. Максимальный модуль значения ограничен примерно 1.8 × 10³⁰⁸, минимальное положительное нормальное число — около 2.2 × 10⁻³⁰⁸.

Способы создания

Число float в Python можно получить несколькими способами:

  • литерал с точкой: 3.14, -0.5, 1.;
  • литерал в экспоненциальной записи: 1.5e3 (то же, что 1500.0), 2e-2 (то же, что 0.02);
  • вызов встроенной функции float(): float("3.14"), float("1e5"), float("inf"), float("nan");
  • деление оператором /: 7 / 2 даёт 3.5 (в отличие от Python 2, где результатом целочисленного деления было бы 3);
  • преобразование из других типов: float(10) → 10.0, float(True) → 1.0, float(False) → 0.0.

Функция float() принимает строки в нескольких формах, включая "inf", "-Infinity", "nan" (необязательно с учётом регистра), а также строки с пробелами по краям. При передаче некорректной строки возникает ValueError.

Арифметические операции

Основные арифметические операции над числами float:

ОператорОперацияПримерРезультат
+сложение1.5 + 2.253.75
-вычитание3.0 - 1.51.5
*умножение2.5 * 410.0
/деление7 / 23.5
//деление с отбрасыванием дробной части7.0 // 23.0
%остаток от деления7.5 % 21.5
**возведение в степень2.0 ** 101024.0

При смешанных выражениях int и float результат всегда float: 2 + 0.5 → 2.5. Исключение — операции, где int-значение сохраняется, например 2 ** 3.0 → 8.0 (тип всё равно float).

Ограничения точности

Из-за двоичного представления дробных чисел с плавающей точкой не все десятичные дроби могут быть записаны точно. Наиболее известный пример:

```

>> 0.1 + 0.2

0.30000000000000004 ```

Это не ошибка Python, а следствие стандарта IEEE 754: значение 0.1 в двоичной системе бесконечно, поэтому хранится приближённо. Для сравнения дробных чисел с допуском используется функция math.isclose(a, b, rel_tol=1e-9) или модуль decimal, предоставляющий арифметику с произвольной точностью.

При превышении максимального значения float возникает OverflowError, а при вычислении выражений вроде 1e308 * 10 возвращается inf. Деление на ноль для float не вызывает исключение: 1.0 / 0.0 → inf, 0.0 / 0.0 → nan.

Специальные значения

Python поддерживает три специальных значения float:

  • float('inf') и float('-inf') — положительная и отрицательная бесконечность;
  • float('nan') — «не число» (Not a Number), результат неопределённых операций;
  • ноль: 0.0 и -0.0 (отрицательный ноль сохраняется, но 0.0 == -0.0 возвращает True).

Сравнения с nan всегда возвращают False, включая nan == nan. Для проверки используется math.isnan(x).

Методы и функции

У типа float есть несколько встроенных методов:

  • float.hex() — шестнадцатеричное представление: (3.14).hex() → '0x1.91eb851eb851fp+1';
  • float.fromhex(s) — обратное преобразование из hex-строки;
  • float.is_integer() — проверка, является ли значение целым: (5.0).is_integer() → True, (5.5).is_integer() → False.

Стандартная библиотека содержит множество функций для работы с float: math.sqrt, math.sin, math.log, math.floor, math.ceil, math.fabs, math.trunc, а также round(x, n) для округления до n знаков после запятой.

Форматирование

Числа float можно выводить в виде строк несколькими способами:

  • f-строки: f"{3.14159:.2f}" → '3.14';
  • метод format: format(3.14159, '.3e') → '3.142e+00';
  • функция repr() — полная точность: repr(0.1) → '0.1'.

Сравнение с decimal и fractions

Для задач, требующих точной десятичной арифметики (финансовые расчёты, бухгалтерия), в Python предусмотрен модуль decimal с типом Decimal, работающим с десятичными цифрами и настраиваемой точностью. Модуль fractions предоставляет тип Fraction для точного представления рациональных чисел. Оба типа медленнее float, но гарантируют отсутствие ошибок округления, характерных для двоичного представления.

Историческая справка

До версии Python 3.0 существовал отдельный тип long для длинных целых чисел, а вещественные числа хранились в формате C double. В Python 3 объединение int и long в единый тип не изменило поведение float: тип по-прежнему соответствует double в CPython. Альтернативная реализация PyPy использует тот же формат IEEE 754 binary64.

Источники:

  • Документация Python: раздел «Built-in Types» (docs.python.org/ru/3/library/stdtypes.html)
  • Документация Python: модуль decimal и модуль math
  • Лутц М. «Изучаем Python», 5-е издание
  • Рамальо Д. «Python. Краткий справочник», 3-е издание
  • IEEE Std 754-2019, Standard for Floating-Point Arithmetic
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru