Float в Python: основы и продвинутые примеры
Понимание чисел с плавающей точкой в Python
Тип float в Python представляет числа с плавающей точкой двойной точности (64 бита) по стандарту IEEE 754. Эти числа широко используются для научных расчётов, денежных вычислений (с осторожностью), работы с дробными значениями и встроенными функциями. Примеры ниже помогут освоить основные операции и избежать типичных ошибок.
x = 3.14 # литерал
negative = -2.5 # отрицательное
big = 1.23e10 # научная нотация
print(x, negative, big)что делает strip в python (метод strip() в python)
3.14 -2.5 12300000000.0
математические примеры python (математические примеры в python)
Как создать число float разными способами?
Первый способ – прямая запись с десятичной точкой. Второй – преобразование из целого числа (int) или строки через float().
a = float(42) # 42.0
b = float("3.1415") # 3.1415
print(a, b)
новые возможности условного оператора python (новые возможности условного оператора в python)
42.0 3.1415
Float python пример (примеры float в python)
Проблема: при передаче в float() некорректной строки (например, "12,5") возникает исключение ValueError. Используйте точку в качестве десятичного разделителя.
Как выполнить основные арифметические операции с float?
С float работают все стандартные операторы: сложение, вычитание, умножение, деление, целочисленное деление, остаток и возведение в степень. Результат обычно тоже float.
a = 10.0
b = 3.0
print(a + b) # 13.0
print(a - b) # 7.0
print(a * b) # 30.0
print(a / b) # 3.3333333333333335
print(a // b) # 3.0
print(a % b) # 1.0
print(a ** b) # 1000.0Python кортежи примеры (примеры кортежей в python)
13.0 7.0 30.0 3.3333333333333335 3.0 1.0 1000.0
словарь в python пример (примеры словарей в python)
Проблема точности: деление 10/3 даёт бесконечную дробь, что проявляется в виде 3.3333333333333335. Это не баг, а свойство двоичной арифметики. Для критичных вычислений используйте decimal.Decimal.
Как округлить число float до нужного количества знаков?
Встроенная функция round() позволяет округлить float до указанного числа знаков после запятой. Для банковского округления (по Гауссу) используйте Decimal.
pi = 3.14159265
print(round(pi, 2)) # 3.14
print(round(pi, 4)) # 3.1416
# Форматирование через f-строку
print(f"{pi:.3f}") # 3.142является ли число четным python (проверка числа на четность в python)
3.14 3.1416 3.142
типы данных в python с примерами (типы данных в python с примерами)
Ловушка: round() использует банковское округление для равноудалённых значений (например, 2.5 округляется до 2, 3.5 до 4). Для строгого математического округления применяйте Decimal с настройкой контекста.
Как сравнивать числа float, избегая ошибок из-за погрешности?
Прямое сравнение через == может дать неожиданные результаты из-за накопления погрешностей. Рекомендуется использовать math.isclose() или абсолютную/относительную разницу.
import math
a = 0.1 + 0.2
b = 0.3
print(a == b) # False
print(math.isclose(a, b)) # True
# Собственная проверка
print(abs(a - b) < 1e-9) # Trueмножественный выбор python (множественный выбор (if-elif-else) в python)
False True True
проверить является ли числом python (проверка, является ли значение числом в python)
Ошибка: использование == для float приводит к ложным отрицаниям. math.isclose() по умолчанию использует относительную и абсолютную погрешности. Настройте параметры rel_tol и abs_tol под задачу.
Как работать со специальными значениями float (inf, nan)?
Python поддерживает бесконечность (inf) и не-число (nan). Они возникают при некоторых операциях и могут быть созданы явно.
import math
x = float('inf')
y = float('-inf')
z = float('nan')
print(x, y, z)
print(math.isinf(x), math.isnan(z))
# Арифметика с inf
print(100 + x) # inf
print(0 * x) # nan (неопределённость)inf -inf nan True True inf nan
Сложность: nan не равно самому себе (z == z даёт False). Для проверки используйте math.isnan(). Бесконечность можно сравнивать, но учтите, что inf - inf даёт nan.
Как преобразовать float в int и строку?
Преобразование в int отбрасывает дробную часть (не округляет). Для округления вниз/вверх используйте math.floor() и math.ceil().
f = 3.76
print(int(f)) # 3
import math
print(math.floor(f)) # 3
print(math.ceil(f)) # 4
print(str(f)) # "3.76"
print(format(f, ".1f")) # "3.8"3 3 4 3.76 3.8
Ошибка: в некоторых версиях Python округление при преобразовании в строку может зависеть от платформы. Используйте format() или f-строки для контроля вывода.
Расширенные примеры работы с float
Демонстрация погрешности двоичного представления
Пример показывает, почему 0.1 + 0.2 не равно 0.3, и как с помощью Decimal можно получить точный результат.
from decimal import Decimal, getcontext
# Стандартный float
a = 0.1
b = 0.2
print("float:", a + b, "== 0.3?", a + b == 0.3)
# Decimal с настройкой точности
getcontext().prec = 28
d1 = Decimal('0.1')
d2 = Decimal('0.2')
print("Decimal:", d1 + d2, "== 0.3?", d1 + d2 == Decimal('0.3'))float: 0.30000000000000004 == 0.3? False Decimal: 0.3 == 0.3? True
Использование math.isclose() с настраиваемыми допусками
Параметры rel_tol (относительный допуск) и abs_tol (абсолютный допуск) позволяют гибко настраивать сравнение.
import math
a = 1e-10
b = 2e-10
print("По умолчанию:", math.isclose(a, b)) # False (относительная разница 100%)
print("Абсолютный допуск:", math.isclose(a, b, abs_tol=1e-9)) # True
# Сравнение с нулём
x = 0.0
y = 1e-15
print("С нулём:", math.isclose(x, y, abs_tol=1e-12)) # TrueПо умолчанию: False Абсолютный допуск: True С нулём: True
Форматирование float для вывода с разным стилем
Различные спецификаторы формата помогают вывести число как валюту, с разделителем тысяч или в научной нотации.
n = 1234567.891234
print(f"Обычный: {n}")
print(f"С фиксированной точкой: {n:.2f}")
print(f"Научный: {n:.2e}")
print(f"Общий: {n:g}")
print(f"С разделителем: {n:,.2f}")Обычный: 1234567.891234 С фиксированной точкой: 1234567.89 Научный: 1.23e+06 Общий: 1.23457e+06 С разделителем: 1,234,567.89
Работа с бесконечностью и нечислами в статистических данных
Пропуски или деление на ноль могут порождать nan и inf. Пример очистки списка от этих значений.
import math
data = [1.0, 2.0, float('nan'), 4.0, float('inf'), 5.0]
# Удаление nan и inf
clean = [x for x in data if not math.isnan(x) and not math.isinf(x)]
print("Исходные:", data)
print("Очищенные:", clean)
# Удаление только nan
clean_nan = [x for x in data if not math.isnan(x)]
print("Без nan:", clean_nan)Исходные: [1.0, 2.0, nan, 4.0, inf, 5.0] Очищенные: [1.0, 2.0, 4.0, 5.0] Без nan: [1.0, 2.0, 4.0, inf, 5.0]
Диагностика точности через sys.float_info
Объект sys.float_info показывает пределы и точность float на текущей платформе.
import sys
info = sys.float_info
print("Максимальное конечное:", info.max)
print("Минимальное положительное нормализованное:", info.min)
print("Машинный эпсилон:", info.epsilon)
print("Количество цифр мантиссы:", info.mant_dig)Максимальное конечное: 1.7976931348623157e+308 Минимальное положительное нормализованное: 2.2250738585072014e-308 Машинный эпсилон: 2.220446049250313e-16 Количество цифр мантиссы: 53
Бинарное представление float
Функция float.hex() возвращает шестнадцатеричную строку точного представления, а hex() с модулем struct даёт сырые байты.
n = 3.14
print("hex():", n.hex())
import struct
packed = struct.pack('!d', n)
print("Байты (big-endian):", packed.hex())hex(): 0x1.91eb851eb851fp+1 Байты (big-endian): 40091eb851eb851f