Целые, вещественные и комплексные числа в Python

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

Работа с числовыми типами

Базовый метод работы с числами состоит в выборе одного из встроенных типов int, float или complex. Дополнительно используется логический тип bool, который унаследован от int.

Целый литерал записывается без точки, но может содержать символ подчёркивания для разделения разрядов.

order_id = 10_000_000
count = 42
negative_value = -7

типы числовых данных в python (типы числовых данных в python)

Вещественный литерал содержит дробную часть или экспоненциальный суффикс.

weight = 72.5
avogadro = 6.022e23
ratio = 1.0

Комплексный литерал формируется как сумма действительной части и мнимой части с суффиксом j.

impedance = 3 + 4j
phase_vector = 2j
polar = 1.5 - 0.5j

Конструкторы int(), float() и complex() преобразуют строки или другие числа.

a = int('255')
b = float('1.25')
c = complex('3+4j')
print(a, b, c)
255 1.25 (3+4j)

Типичная особенность: значение 0.1 + 0.2 не равно 0.3 из-за двоичного формата float.

print(0.1 + 0.2 == 0.3)
False

Для сравнения приближённых вещественных чисел применяется math.isclose().

import math
print(math.isclose(0.1 + 0.2, 0.3))
True

Как проверить принадлежность числа к типу?

Функция type() показывает точный класс объекта, а isinstance() позволяет учитывать наследование.

values = [5, 2.3, 1 + 2j, True]
for element in values:
    print(type(element).__name__)
int
float
complex
bool

Значение True принадлежит классу bool, который является подклассом int.

print(True + 1)
print(isinstance(True, int))
2
True

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

Один слэш возвращает обычное частное, два слэша целую часть, а символ процента остаток.

total = 17
parts = 5
ordinary = total / parts
integer_part = total // parts
remainder = total % parts
print(ordinary, integer_part, remainder)
3.4 3 2

Распространённое затруднение: при работе с отрицательными числами оператор // выполняет округление вниз, а не в сторону нуля.

print(-17 // 5)
print(-17 % 5)
-4
3

Для отбрасывания дробной части в сторону нуля применяется int(-17 / 5).

print(int(-17 / 5))
-3

Как получить точный результат в денежных расчётах?

Тип Decimal из модуля decimal хранит десятичные числа с настраиваемой точностью. Строка передаётся в конструктор, чтобы исходное значение не прошло через двоичное представление float.

from decimal import Decimal
price = Decimal('19.99')
quantity = Decimal('3')
result = price * quantity
print(result)
59.97

Метод quantize() управляет количеством знаков после запятой.

from decimal import Decimal, ROUND_HALF_UP
value = Decimal('2.675')
rounded = value.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
print(rounded)
2.68

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

Класс Fraction из модуля fractions хранит числитель и знаменатель в виде пары целых чисел.

from fractions import Fraction
a = Fraction(1, 3)
b = Fraction(1, 6)
total = a + b
print(total)
1/2

Дробь также создаётся из строки, содержащей десятичное число.

print(Fraction('0.75'))
3/4

Какие свойства раскрывают структуру комплексного числа?

Комплексный объект имеет свойства real и imag, метод conjugate() и функцию abs() для модуля.

z = 3 + 4j
print(z.real)
print(z.imag)
print(abs(z))
print(z.conjugate())
3.0
4.0
5.0
(3-4j)

Аргумент комплексного числа получается функцией cmath.phase().

import cmath
print(cmath.phase(1 + 1j))
0.7853981633974483

Приведённые ниже примеры показывают менее очевидные возможности числовых типов.

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

Конструктор int() принимает второй аргумент от 2 до 36. Эта возможность используется для разбора двоичных, восьмеричных и шестнадцатеричных констант.

Пример
from_binary = int('1010', 2)
from_octal = int('17', 8)
from_hex = int('ff', 16)
print(from_binary, from_octal, from_hex)
10 15 255

Строка не может содержать посторонние символы. Например, int('12', 2) вызывает ошибку ValueError, поскольку цифра 2 не существует в двоичной записи.

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

Метод to_bytes требует указать количество байт и порядок следования байтов. Метод from_bytes выполняет обратную операцию.

Пример
number = 1024
packed = number.to_bytes(2, byteorder='big', signed=False)
print(packed.hex())
restored = int.from_bytes(packed, byteorder='big')
print(restored)
0400
1024

Как увидеть точное двоичное представление числа float?

Метод as_integer_ratio возвращает пару числитель и знаменатель, соответствующую внутреннему двоичному значению переменной.

Пример
value = 1.5
print(value.as_integer_ratio())
unexpected = 0.1
print(unexpected.as_integer_ratio())
(3, 2)
(3602879701896397, 36028797018963968)

Какие особые значения допускает float?

Бесконечность и значение NaN создаются через float('inf') и float('nan'). NaN не равно самому себе, поэтому для проверки применяется метод isnan().

Пример
positive_infinity = float('inf')
negative_infinity = float('-inf')
not_a_number = float('nan')
print(positive_infinity > 10_000_000)
print(negative_infinity < 0)
print(not_a_number == not_a_number)
print(not_a_number.isnan())
True
True
False
True

Чем различаются floor, ceil и trunc?

Функция floor округляет вниз, ceil вверх, а trunc отбрасывает дробную часть в сторону нуля.

Пример
import math
print(math.floor(2.9))
print(math.ceil(2.1))
print(math.trunc(-2.9))
2
3
-2

Как изменить точность Decimal и не повлиять на остальной код?

Контекст localcontext создаёт временную область с заданной точностью. После выхода из блока восстанавливается прежняя настройка.

Пример
from decimal import Decimal, localcontext
with localcontext() as context:
    context.prec = 3
    limited = Decimal('1.23') * Decimal('0.45')
    print(limited)
full = Decimal('1.23') * Decimal('0.45')
print(full)
0.554
0.5535

Как выполнить точное умножение дробей и получить упрощённый результат?

Fraction автоматически сокращает результат до наименьшего знаменателя.

Пример
from fractions import Fraction
a = Fraction(1, 6)
b = Fraction(2, 3)
result = (a + b) * Fraction(3, 1)
print(result)
print(result.numerator)
print(result.denominator)
5/2
5
2

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

Побитовые операции удобны для набора флагов, маскирования битов и быстрых операций с двоичными разрядами.

Пример
flag = 0b1100
mask = 0b1010
print(bin(flag & mask))
print(bin(flag | mask))
print(bin(flag ^ mask))
print(bin(flag << 1))
print(bin(flag >> 1))
0b1000
0b1110
0b110
0b11000
0b110

Почему True и False участвуют в арифметике?

Тип bool является подклассом int, поэтому логические значения ведут себя как единица и ноль в числовых выражениях.

Пример
print(True + True)
print(True * 8)
print(False - 1)
print(True == 1)
print(False == 0)
2
8
-1
True
True

Как связаны модуль и аргумент комплексного числа?

Функции cmath.polar возвращают радиус и угол в радианах для комплексного числа.

Пример
import cmath
z = 1 + 1j
magnitude, phase = cmath.polar(z)
print(magnitude)
print(phase)
1.4142135623730951
0.7853981633974483

Типы числовых данных в Python - comments

En
типы числовых данных в python (python)