← Все вопросы

Что такое приведение типов в Python (int, str, float) и почему int("12.5") падает с ошибкой?

Задан 4 дня назад357 просмотров2 ответа
2

Пытаюсь сложить число, которое пришло из input(), с другим числом, но получаю ошибку. Потом попробовал int("12.5") — вылетает ValueError, хотя int(12.9) работает и даёт 12. Совсем не понимаю логику: когда надо приводить типы вручную, а когда Python делает это сам?

2 ответа

9
✓ Принятый ответ — помог автору

Приведение типов (каст) — это превращение значения одного типа в другой. В Python есть встроенные функции-конструкторы: int(), float(), str(), bool() и т.д.

Главная причина твоей первой ошибки: input() всегда возвращает строку, даже если ты ввёл цифры. А "5" + 3 Python сложить не может:

x = input("число: ")   # пришло "5" (строка!)
print(int(x) + 3)      # 8 — сначала приводим к int

Теперь про загадку int("12.5") vs int(12.9):

int(12.9)      # 12  — округляет float ВНИЗ (отбрасывает дробную часть)
int("12")      # 12  — парсит строку с целым числом
int("12.5")    # ValueError! строку с точкой int парсить не умеет

Разница в том, что при работе со строкой int() ожидает текст, который выглядит ровно как целое число. Точка его ломает. А вот с числом (float) он просто отбрасывает дробь. Чтобы спарсить строку с точкой — приведи сначала к float:

int(float("12.5"))   # 12

Неявное приведение Python делает сам в арифметике между числами: 2 + 3.0 даст 5.0 — int молча «повышается» до float. Но между строкой и числом он этого не делает (в отличие от JS) — и правильно, иначе были бы тихие баги.

Про bool(): «пустое» считается Falsebool(0), bool(""), bool([])False, а почти всё остальное → True (включая bool("0")True, потому что строка непустая, это частая ловушка!). Чтобы не падать на кривом вводе — оборачивай каст в try/except ValueError.

0

Уточню про округление, на этом многие спотыкаются: int() НЕ округляет математически, он отбрасывает дробную часть (truncate) в сторону нуля.

int(2.9)    # 2,  а не 3
int(-2.9)   # -2, а не -3
round(2.9)  # 3 — вот это уже честное округление

Если нужно именно округлить — бери round(). И помни, что round() использует «банковское» округление к чётному: round(2.5) даёт 2, а не 3. Для денег это часто не то, что хочется — там лучше decimal.Decimal.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект