Тип 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.25 | 3.75 |
- | вычитание | 3.0 - 1.5 | 1.5 |
* | умножение | 2.5 * 4 | 10.0 |
/ | деление | 7 / 2 | 3.5 |
// | деление с отбрасыванием дробной части | 7.0 // 2 | 3.0 |
% | остаток от деления | 7.5 % 2 | 1.5 |
** | возведение в степень | 2.0 ** 10 | 1024.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
