Практическое руководство по преобразованию значений в тип float
Преобразование в тип float
Основной и наиболее распространённый способ преобразования значения в число с плавающей точкой в Python - использование встроенной функции float(). Она принимает один аргумент: число (целое, дробное) или строку, представляющую число.
# Преобразование целого числа
a = float(10)
print(a) # 10.0преобразовать в float python (преобразование в float в python)
10.0
Python 2 float (float в python 2)
# Преобразование строки с десятичной точкой
b = float("3.14159")
print(b) # 3.14159
3.14159
# Преобразование строки с научной нотацией
c = float("2.5e-3")
print(c) # 0.0025
0.0025
Возможные проблемы:
- ValueError - если строка не может быть интерпретирована как число с плавающей точкой (например, "abc", "12,34" с запятой). Решение - предварительная проверка или обработка исключений.
- OverflowError - при передаче числа, выходящего за диапазон float (в современных версиях Python скорее вернётся inf). Рекомендуется использовать модуль decimal для особых случаев.
try:
val = float("не число")
except ValueError:
val = 0.0
Цели использования: преобразование данных из пользовательского ввода, чтение чисел из текстовых файлов, работа с данными, полученными из API.
Как преобразовать число с плавающей точкой из строки, где разделитель - запятая?
В некоторых региональных форматах десятичная часть отделяется запятой. Прямой вызов float("3,14") вызовет ошибку. Решение - заменить запятую на точку.
s = "3,14"
val = float(s.replace(",", "."))
print(val) # 3.14
Проблема: если строка содержит разделители тысяч (например, "1.234,56"), замена всех запятых может привести к неверному результату. Тогда лучше использовать locale.atof.
Как выполнить точные финансовые расчёты без погрешностей float?
Тип float имеет ограниченную точность (около 15–17 значащих цифр). Для денежных вычислений рекомендуется модуль decimal.
from decimal import Decimal, getcontext
getcontext().prec = 28
d = Decimal('0.1') + Decimal('0.2')
print(d) # 0.3
print(float(d)) # 0.3
При преобразовании Decimal во float может снова возникнуть потеря точности. Поэтому для финального представления часто используют округление.
Как преобразовать сразу список строк в числа с плавающей точкой?
Для массового преобразования применяется генератор списка или функция map.
str_list = ["1.5", "2.7", "3.14"]
float_list = [float(x) for x in str_list]
print(float_list) # [1.5, 2.7, 3.14]
Если среди строк есть нечисловые, возникнет ошибка. Можно обернуть преобразование в функцию с обработкой исключений.
def safe_float(s):
try:
return float(s)
except ValueError:
return None
mixed = ["1.5", "abc", "2.0"]
result = [safe_float(x) for x in mixed]
print(result) # [1.5, None, 2.0]
Как преобразовать число из строки с разделителями тысяч и локализованным форматом?
Модуль locale предоставляет функцию atof для преобразования строк, учитывающую текущую локаль.
import locale
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
s = "1.234,56"
val = locale.atof(s)
print(val) # 1234.56
Требуется установить соответствующую локаль, которая может быть недоступна в некоторых окружениях. В таком случае используется замена с регулярными выражениями.
Расширенные примеры преобразования в float
Ниже приведены примеры, которые помогут глубже понять нюансы преобразования в число с плавающей точкой.
Преобразование шестнадцатеричных чисел с плавающей точкой
Python 3.1+ поддерживает строки в формате шестнадцатеричной записи IEEE 754.
hex_str = "0x1.921fb54442d18p+1" # число π с точностью double
val = float.fromhex(hex_str)
print(val) # 3.141592653589793
print(val.hex()) # обратное преобразование
3.141592653589793 0x1.921fb54442d18p+1
Преобразование с использованием map и lambda для обработки ошибок
Фильтрация некорректных значений.
data = ["10.5", "", "3.14", "abc", "2.0"]
cleaned = list(map(lambda x: float(x) if x.replace('.','',1).isdigit() else None, data))
print(cleaned) # [10.5, None, 3.14, None, 2.0]
[10.5, None, 3.14, None, 2.0]
Проверка isdigit работает только для чисел без знака. Для полной проверки лучше использовать регулярные выражения или блок try/except.
Преобразование массивов с помощью NumPy
Библиотека NumPy обеспечивает эффективное преобразование больших массивов данных.
import numpy as np
string_array = np.array(["1.1", "2.2", "3.3"])
float_array = string_array.astype(np.float64)
print(float_array) # [1.1 2.2 3.3]
print(float_array.dtype) # float64
[1.1 2.2 3.3] float64
При ошибке в одном элементе NumPy вызовет ValueError. Для обработки можно использовать np.genfromtxt с параметром dtype=None.
Преобразование с использованием Fraction для рациональных чисел
Модуль fractions позволяет преобразовывать строки вида "3/4" в float.
from fractions import Fraction
frac = Fraction("3/4")
val = float(frac)
print(val) # 0.75
0.75
Преобразование строк с унарными операторами
Функция float не поддерживает конвертацию строк вида "+3.14" или "-5.5"? На самом деле поддерживает.
print(float("+3.14")) # 3.14
print(float("-5.5")) # -5.5
3.14 -5.5
Но строка "++3.14" вызовет ошибку.
Преобразование с обработкой бесконечности и NaN
Python распознаёт строки "inf", "-inf", "infinity", "nan" (без учёта регистра).
for s in ["inf", "-inf", "infinity", "nan", "NaN"]:
print(f"float('{s}') = {float(s)}")
float('inf') = inf
float('-inf') = -inf
float('infinity') = inf
float('nan') = nan
float('NaN') = nan
Преобразование с округлением после конвертации
Иногда требуется получить не точное значение float, а округлённое до определённого числа знаков.
raw = "3.141592653589793"
val = round(float(raw), 3)
print(val) # 3.142
3.142
Округление может привести к дополнительной погрешности, поэтому его применяют только для вывода.
Преобразование с помощью eval (не рекомендуется)
Функция eval может вычислить строку как Python-выражение, но она опасна из-за возможности выполнения произвольного кода.
# eval("3.14") -> 3.14
# eval("1+2") -> 3 (но это не float)
# Лучше использовать float() или Decimal.
Использовать eval для преобразования строк, введённых пользователем, категорически не рекомендуется.