Типы int и float: целые и вещественные числа в Python
Основы работы с целыми числами и числами с плавающей точкой
В Python числовые типы int (целое число) и float (число с плавающей точкой) являются фундаментальными для любых вычислений. Они поддерживают все стандартные арифметические операции: сложение, вычитание, умножение, деление, целочисленное деление, остаток от деления, возведение в степень. При смешивании типов результат автоматически приводится к float, если хотя бы один из операндов является вещественным.
a = 10 # int
b = 3.5 # float
c = a + b # 13.5 (float)
d = a // b # 2.0 (float, целочисленное деление)Int float python тип (типы int и float в python)
Целые числа в Python не имеют ограничения по размеру (кроме доступной памяти), что позволяет работать со сколь угодно большими значениями. Числа с плавающей точкой реализованы по стандарту IEEE 754 и имеют конечную точность (обычно 53 бита мантиссы).
Типичная ошибка: потеря точности при сравнении float. Например, 0.1 + 0.2 == 0.3 вернёт False. Для сравнения вещественных чисел следует использовать math.isclose().
Как преобразовать строку в число и обработать ошибки?
Функции int() и float() принимают строку и возвращают число. Если строка не соответствует числовому формату, возникает исключение ValueError. Безопасный способ - использовать обработку исключений.
def safe_to_int(s):
try:
return int(s)
except ValueError:
return None
print(safe_to_int("123")) # 123
print(safe_to_int("12.3")) # None
При преобразовании строки с пробелами или знаками валюты int() и float() не сработают. Требуется предварительная очистка: .replace('$', '').strip().
Как округлить число до заданного количества знаков?
Встроенная функция round() округляет число. Синтаксис: round(number, ndigits). Если ndigits не указан, округляется до целого. Важно: round() использует банковское округление (round half to even), что может давать неожиданные результаты.
print(round(2.5)) # 2 (половина округляется к чётному)
print(round(3.5)) # 4
print(round(2.675, 2)) # 2.67 (из-за ошибки представления)
Для фиксированного округления вверх или вниз применяются math.ceil() и math.floor(). Для точного десятичного округления удобнее модуль decimal.
Как проверить, является ли число целым или вещественным?
Используется функция isinstance() или сравнение с типами int и float. Для проверки того, что число не имеет дробной части, можно применить is_integer() для float.
x = 5.0
print(isinstance(x, (int, float))) # True
print(x.is_integer()) # True
is_integer() не работает с int, только с float. Для универсальной проверки: isinstance(x, int) or (isinstance(x, float) and x.is_integer()).
Как выполнить возведение в степень и извлечение корня?
Оператор ** возводит в степень. Для квадратного корня используется math.sqrt() или возведение в степень 0.5.
print(2 ** 10) # 1024
print(9 ** 0.5) # 3.0
import math
print(math.sqrt(16)) # 4.0
Возведение в степень больших чисел может потребовать много памяти. Для целых чисел результат может быть очень большим, но Python справляется.
Расширенные примеры работы с int и float
Целочисленные методы и свойства
Целые числа имеют несколько полезных методов:
num = 255
print(num.bit_length()) # 8 (количество бит для представления)
print(num.bit_count()) # 8 (количество единичных бит, Python 3.8+)
print(num.to_bytes(2, 'big')) # b'\x00\xff'
8 8 b'\x00\xff'
Метод to_bytes() преобразует целое число в байтовую строку заданной длины. Обратное преобразование - int.from_bytes().
b = b'\x01\x02'
val = int.from_bytes(b, 'big')
print(val) # 258
258
Методы чисел с плавающей точкой
Тип float также предоставляет ряд методов, связанных с внутренним представлением:
f = 6.5
print(f.as_integer_ratio()) # (13, 2) - числитель и знаменатель
print(f.is_integer()) # False
print(f.hex()) # '0x1.a000000000000p+2' - шестнадцатеричное представление
(13, 2) False 0x1.a000000000000p+2
Шестнадцатеричное представление полезно для точного обмена данными без потерь при сериализации.
Проблемы точности float и способы их решения
Внутреннее двоичное представление многих десятичных дробей неточно. Это приводит к накоплению ошибок при вычислениях.
a = 0.1 + 0.2
print(a) # 0.30000000000000004
print(a == 0.3) # False
print(0.1 * 3) # 0.30000000000000004
Для сравнения чисел используется math.isclose() или относительная/абсолютная погрешность.
import math
print(math.isclose(0.1 + 0.2, 0.3)) # True
True
Если требуется строгая десятичная точность (деньги, налоги), применяется модуль decimal.
from decimal import Decimal
a = Decimal('0.1')
b = Decimal('0.2')
print(a + b) # 0.3
print((a + b) == Decimal('0.3')) # True
0.3 True
Работа с огромными целыми числами
Python автоматически расширяет разрядность int.
big = 10**100
print(big)
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Можно выполнять арифметические операции с такими числами без переполнения, но время выполнения растет.
a = 2 ** 1000
b = a // 123456
print(len(str(b))) # 302 символа
302
Битовые операции над целыми
Целые числа поддерживают побитовые операции (&, |, ^, ~, <<, >>), что полезно для флагов, масок и низкоуровневого программирования.
mask = 0b1100
flag = 0b1010
print(bin(mask & flag)) # 0b1000
print(bin(mask | flag)) # 0b1110
0b1000 0b1110
Преобразование между системами счисления
Для перевода целого числа в двоичную, восьмеричную, шестнадцатеричную строку служат встроенные функции bin(), oct(), hex(). Обратные преобразования - int() с указанием основания.
print(bin(42)) # 0b101010
print(oct(42)) # 0o52
print(hex(42)) # 0x2a
print(int('101010', 2)) # 42
0b101010 0o52 0x2a 42
Использование fractions для рациональных чисел
Модуль fractions позволяет точно представлять дроби, избегая проблем с плавающей точкой.
from fractions import Fraction
f1 = Fraction(1, 3)
f2 = Fraction(2, 3)
print(f1 + f2) # 1
1
Результатом является дробь, которая при необходимости может быть преобразована в float.
print(float(Fraction(22, 7))) # 3.142857142857143
3.142857142857143