Как получить вещественное число из различных типов в Python

Раздел: Основы Python -> Преобразование в числовые типы

Преобразование в float: основные способы

float(x) - встроенная функция, преобразующая объект x в число с плавающей точкой. Поддерживает строки и числа.

float('3.14')  # 3.14
float(5)       # 5.0
float(' -1.23e-4 ') # -0.000123

перевести в float python (преобразование в float в python)

Возможные ошибки: ValueError при некорректной строке, TypeError для неподдерживаемых типов (например, список).

Как преобразовать строку с запятой вместо точки?

Замена запятой на точку перед вызовом float:

s = '3,14'
float(s.replace(',', '.'))  # 3.14
Проблема: если строка уже содержит точку, замена не повредит, но может превратить '1,2.3' в '1.2.3' (ошибка). Лучше проверять.

Как безопасно преобразовать с обработкой ошибок?

Использование try/except:

def safe_float(value):
    try:
        return float(value)
    except (ValueError, TypeError):
        return None
Типичная ошибка: забыть обработать TypeError при передаче None или списка.

Как преобразовать целое число или булево значение?

float работает напрямую:

float(True)  # 1.0
float(False) # 0.0
float(42)    # 42.0

Как использовать Decimal для точных финансовых расчетов с преобразованием?

Сначала создаём Decimal, затем преобразуем в float:

from decimal import Decimal
d = Decimal('0.1')
f = float(d)  # 0.1 (с потерей точности)
Decimal обеспечивает точность, но float не может её сохранить. Для точных вычислений оставляйте Decimal.

Как преобразовать строку с учётом локали (разделитель тысяч)?

Использование locale.atof:

import locale
locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')
locale.atof('1 234,56') # 1234.56
Требует установленной локали. На Windows возможны сложности.

Как преобразовать список строк в список float?

Применяем list comprehension или map:

strings = ['1.5', '2.7', '3.14']
floats = [float(s) for s in strings]  # [1.5, 2.7, 3.14]
# или
floats = list(map(float, strings))

Часто встречающиеся проблемы:

  • Попытка преобразовать пустую строку: float('') -> ValueError
  • Строка с пробелами и табуляциями: float(' 1.5 ') корректно, но float('1,5') - ошибка.
  • Некорректные символы: float('12a') -> ValueError
  • Специальные значения: float('nan'), float('inf'), float('-inf') допустимы.
  • Преобразование None: TypeError, а не ValueError.

Расширенные примеры преобразования в float

Ниже приведены нестандартные ситуации и способы их обработки.

Пример 1: Преобразование строки с научной нотацией

Пример
float('1.23e-4')   # 0.000123
float('1E2')       # 100.0
float('1.5e+2')    # 150.0
Результат: 0.000123, 100.0, 150.0

Пример 2: Преобразование из типа Fraction (дробь)

Пример
from fractions import Fraction
f = Fraction(3, 4)
float(f)  # 0.75
0.75

Пример 3: Преобразование из Decimal с контролем точности

Пример
from decimal import Decimal, getcontext
getcontext().prec = 4
d = Decimal('1.234567')
f = float(d)  # 1.234567 (Decimal не округляет, float теряет точность)
1.234567

Пример 4: Использование ast.literal_eval для безопасного парсинга

Пример
import ast
def parse_float(s):
    try:
        return ast.literal_eval(s)
    except (ValueError, SyntaxError):
        return None
parse_float('1.5')  # 1.5
parse_float('1,5')  # None (ошибка)
1.5, None

Пример 5: Преобразование строки с несколькими точками (ошибка)

Пример
float('1.2.3')  # ValueError: could not convert string to float: '1.2.3'
Traceback (most recent call last):
  ...
ValueError: could not convert string to float: '1.2.3'

Пример 6: Преобразование булевых значений

Пример
float(True)   # 1.0
float(False)  # 0.0
float(1==1)   # 1.0
float(1==2)   # 0.0
1.0, 0.0, 1.0, 0.0

Пример 7: Преобразование строки с ведущими нулями

Пример
float('00123.45')  # 123.45
float('0.0')       # 0.0
float('0')         # 0.0
123.45, 0.0, 0.0

Пример 8: Преобразование строки со знаком плюс и минус

Пример
float('+1.5')  # 1.5
float('-2.0')  # -2.0
float('--3.0') # ValueError
1.5, -2.0, ValueError

Пример 9: Применение map ко многим строкам

Пример
data = ['1.1', '2.2', '3.3', 'не число']
floats = []
for s in data:
    try:
        floats.append(float(s))
    except ValueError:
        floats.append(None)
print(floats)  # [1.1, 2.2, 3.3, None]
[1.1, 2.2, 3.3, None]

Пример 10: Преобразование строки с пробелами и табуляциями

Пример
float('  \t  3.14  ')  # 3.14 (пробелы игнорируются)
3.14

Пример 11: Проверка на специальные значения

Пример
float('inf')   # inf
float('-Inf')  # -inf
float('NaN')   # nan
import math
math.isnan(float('NaN'))  # True
inf, -inf, nan, True

Пример 12: Использование регулярных выражений для валидации

Пример
import re
def is_float(s):
    pattern = r'^[+-]?(\d+\.?\d*|\d*\.?\d+)([eE][+-]?\d+)?$'
    return bool(re.match(pattern, s.strip()))
print(is_float('3.14')) # True
print(is_float('.5'))   # True
print(is_float('1.'))   # True
print(is_float('1.2.3')) # False
True, True, True, False

преобразование в float в Python - comments

En
перевести в float python (python)