Работа с числами в Python: int, float, complex

Раздел: Типы данных -> Основные понятия

Числовые типы в Python

В языке Python существуют три основных числовых типа: int (целые числа), float (вещественные числа с плавающей точкой) и complex (комплексные числа). Эти типы являются встроенными и не требуют импорта дополнительных модулей.

Примеры создания чисел:


a = 42           # int
b = 3.14159      # float
c = 2 + 3j       # complex
d = 1_000_000    # int с разделителем разрядов

print(type(a))  # <class 'int'>
print(type(b))  # <class 'float'>
print(type(c))  # <class 'complex'>

Python исходный код программы (исходный код программы на python)

Основные арифметические операции:


x = 15
y = 4

print(x + y)   # 19
print(x - y)   # 11
print(x * y)   # 60
print(x / y)   # 3.75  (вещественное)
print(x // y)  # 3     (целочисленное деление)
print(x % y)   # 3     (остаток)
print(x ** y)  # 50625 (возведение в степень)

Python числа (числа в python)

Особенности типа int: не имеет ограничения по длине (может быть сколь угодно большим). float использует стандарт IEEE 754 (64 бита), поэтому точность ограничена (около 15–17 значащих цифр). complex состоит из вещественной и мнимой частей, обе являются числами с плавающей точкой.

Почему 0.1 + 0.2 не равно 0.3?


print(0.1 + 0.2)  # 0.30000000000000004
print(0.1 + 0.2 == 0.3)  # False

Это известная проблема бинарного представления чисел с плавающей точкой. Для точных финансовых расчетов следует использовать модуль decimal. Также возможна ошибка деления на ноль:


# print(10 / 0)  # ZeroDivisionError: division by zero

Как задать число в двоичной, восьмеричной или шестнадцатеричной системе?

Python поддерживает литералы разных систем счисления:


bin_num = 0b1101     # 13 в двоичной
 oct_num = 0o17      # 15 в восьмеричной
 hex_num = 0x1F      # 31 в шестнадцатеричной

print(bin_num, oct_num, hex_num)  # 13 15 31

Для преобразования числа в строку с указанием системы используются функции bin(), oct(), hex():


print(bin(13))    # 0b1101
print(oct(13))    # 0o15
print(hex(31))    # 0x1f

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

Для безопасного преобразования строки в число используются встроенные функции с проверкой:


int_val = int("42")         # 42
float_val = float("3.14")   # 3.14
complex_val = complex("2+3j")  # (2+3j)

# Можно указать основание системы счисления
int_from_bin = int("1010", 2)  # 10

Что делать, если строка не является корректным числом?

Возникает исключение ValueError. Следует обрабатывать его с помощью try/except:


s = "abc"
try:
    num = int(s)
except ValueError:
    print("Невозможно преобразовать строку в число")
Как выполнить округление чисел?

Для округления используется встроенная функция round(), а также math.floor() и math.ceil():


import math

x = 3.14159
print(round(x, 2))      # 3.14
print(math.floor(x))    # 3
print(math.ceil(x))     # 4

Почему round(2.5) возвращает 2?

Функция round() в Python использует банковское округление (округление до ближайшего чётного). Для привычного математического округления можно использовать Decimal.


from decimal import Decimal, ROUND_HALF_UP

print(Decimal("2.5").quantize(Decimal("0"), rounding=ROUND_HALF_UP))  # 3

Расширенные примеры работы с числами

Ниже приведены более сложные и не столь очевидные сценарии использования числовых типов в Python.

Большие целые числа и их свойства

Пример

# Целые числа не ограничены по длине
big_num = 2 ** 1000
print(big_num)
# Результат:
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
(вывод опущен из-за длины, но он будет целым числом из 303 цифр)

Метод bit_length() показывает количество бит, необходимых для представления числа:

Пример

print(big_num.bit_length())  # 1001
1001

Представление float в виде дроби

Пример

x = 0.75
print(x.as_integer_ratio())  # (3, 4)
(3, 4)

Сравнение чисел с плавающей точкой с допуском

Пример

import math

a = 0.1 + 0.2
b = 0.3
print(math.isclose(a, b, rel_tol=1e-9))  # True
True

Использование Decimal для точных вычислений

Пример

from decimal import Decimal

d1 = Decimal("0.1")
d2 = Decimal("0.2")
print(d1 + d2)  # 0.3
print((d1 + d2) == Decimal("0.3"))  # True
0.3
True

Работа с рациональными дробями (Fraction)

Пример

from fractions import Fraction

frac1 = Fraction(1, 3)
frac2 = Fraction(2, 5)
print(frac1 + frac2)            # 11/15
print(frac1 * frac2)            # 2/15
print(frac2.limit_denominator(10))  # 2/5 (без изменений)
11/15
2/15
2/5

Комплексные числа: свойства и операции

Пример

c = 3 + 4j
print(c.real)        # 3.0
print(c.imag)        # 4.0
print(abs(c))        # 5.0  (модуль)
print(c.conjugate()) # (3-4j)

# Арифметика с комплексными числами
d = 1 + 2j
print(c + d)   # (4+6j)
print(c * d)   # (-5+10j)
print(c ** 2)  # (-7+24j)
3.0
4.0
5.0
(3-4j)
(4+6j)
(-5+10j)
(-7+24j)

Случайные числа

Пример

import random

# Случайное целое от 1 до 10
print(random.randint(1, 10))

# Случайное float от 0 до 1
print(random.random())

# Выбор случайного элемента из последовательности
print(random.choice([1, 2, 3, 4, 5]))
(пример вывода) 7
0.832456
3

Побитовые операции над целыми числами

Пример

a = 0b1100  # 12
b = 0b1010  # 10

print(bin(a & b))   # 0b1000 (побитовое И)
print(bin(a | b))   # 0b1110 (побитовое ИЛИ)
print(bin(a ^ b))   # 0b0110 (исключающее ИЛИ)
print(bin(~a))      # -0b1101 (побитовое НЕ с учётом знака)
print(bin(a << 2))  # 0b110000 (сдвиг влево)
print(bin(a >> 2))  # 0b11 (сдвиг вправо)
0b1000
0b1110
0b110
-0b1101
0b110000
0b11

Размер числа в памяти

Пример

import sys

print(sys.getsizeof(10))       # 28 (на 64-битной системе)
print(sys.getsizeof(10**100))  # больше, зависит от величины
28
72

Числа в Python - comments

En
Python числа (python)