Немного про числовые типы в Питоне

Итак, буду понемного записывать то, что узнаю по питону или что-то из того, что я хотел бы закрепить.
На текущий момент начал проходить курс по Питону от Яндекс.Практикума, поэтому какие-то предложения, примеры, могут браться оттуда.

Числа

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

Тип Int

К классу int относятся все положительные и отрицательные числа, без дробной части - в том числе и 0.
Числа данного типа можно записывать в том числе через нижнее подчеркивание, применяется это когда числа у нас большие и их невозможно прочитать без разделения.
Например,

## вот так переменная плохо читается
a = 1000000000
print(a)

# а так уже лучше
a = 1_000_000_000
print(a)

Как мне кажется это применимо скорее для каких-то констант, которые мы записываем в коде и, как правило, не применяется.

Переменные типа int, как и переменные других типов, не требуют отдельного объявления: Python автоматически присвоит переменной нужный тип при операции присваивания:

x = 0  # x - это int
y = 150  # y - это int
z = -100  # z - тоже int 

Тип Float

Тип float применяют для представления вещественных числе, а название произошло от английского «float number». В данном типе целую часть от дробной отделяют не запятой, а точкой.

# Знакомьтесь, это float
a = 3.3333
b = 5.
c = 2.0
x = .007
y = 0.007 

Значения для b и x указаны в сокращенном синтаксисе. Если при записи числа перед точкой или после неё ничего не указано, то Питон понимает, что целая или дробная часть равны нулю.

С данным типом чисел важно помнить, что на длину чисел с плавающей точкой накладываются ограничения, в отличии от int. Ограничения зависят от компьютера на котором выполняется программа.

Например, так как потенциально дробь 1/3 может занять всю доступную память, то при записи автоматически дробь может быть округлена, что приводит к проблеме с погрешностью в округлении.

excellent = 0.4 + 0.4 + 0.2
print('excellent =', excellent)

badly = 0.3 + 0.3 + 0.3 + 0.1
print('badly =', badly)

### Результат
excellent = 1.0
badly = 0.9999999999999999

Погрешность связана с тем, что на аппаратном уровне компьютер понимает только два числа: 0 и 1. При переводе из двоичной системы в десятеричную возникает ошибка в округлении получившегося значения.

В большинстве случаев подобные ошибки незаментны, но иногда точность очень важна и от нее может зависеть многое.

Чтобы не потерять точность при вычислениях, используют такой приём: перед обработкой число типа float домножают на 10 в степени n (на 10, 100, 1000...). Множитель подбирают так, чтобы дробная часть исходного числа стала равной нулю; затем проводят необходимые операции, а после обработки полученное значение делят на то же число, на которое умножали, приводя разрядность числа в исходное состояние.

Еще есть одна особенность - при деленое одного целого числа на другое мы получим тип float, а не int.

x = 20 / 2
print(x)
# Вывод в терминал: 10.0

x = 11 / 3
print(x)
# Вывод в терминал: 3.6666666666666665 

Кроме встроенных данных есть еще сторонние модули, которые помогают работать с числами. Например, модуль Decimal.

Модуль Decimal

Когда важна точность - можем применить встроенный в Python модуль Decimal. Он даёт почти стопроцентную точность при работе с дробями.
Для объявления таких чисел нужно

  • импортировать в код класс Decimal;
  • при объявлении переменной указать этот класс;
  • передать в конструктор класса значение числа в кавычках — в виде строки.
from decimal import Decimal

x = Decimal('3.3')
print(type(x))

# Вывод в терминал: <class 'decimal.Decimal'> 
from decimal import Decimal

i = 3.3 + 4.1
print(i)
# Вывод в терминал: 7.3999999999999995

i = Decimal('3.3') + Decimal('4.1')
print(i)
# Вывод в терминал: 7.4 

Тип Complex

В python есть еще и комплексные числа, но о них я ничего рассказать не могу. Может когда-нибудь в будущем осилю.