- Python Modulo — оператор %
- Пример оператора модуля Python
- 1. По модулю с целыми числами
- 2. По модулю с поплавком
- 3. Модульное с пользовательским вводом.
- 4. Пример ZeroDivisionError
- 5. По модулю с отрицательными числами
- 6. Python Modulo math.fmod()
- Перегрузка оператора по модулю
- Коротко о проблемах арифметики с плавающей запятой
Python Modulo — оператор %
Оператор модуля Python (%) используется для получения остатка от деления. Операция по модулю поддерживается для целых чисел и чисел с плавающей запятой.
Синтаксис оператора по модулю: a % b . Здесь «a» — дивиденд, а «b» — делитель. Результат — это остаток от деления a на b.
Если и «a», и «b» являются целыми числами, то остаток также является целым числом. Если одно из них является числом с плавающей запятой, результатом также будет число с плавающей запятой.
Пример оператора модуля Python
Давайте посмотрим на несколько примеров оператора по модулю.
1. По модулю с целыми числами
2. По модулю с поплавком
3. Модульное с пользовательским вводом.
x = input("Please enter first number:\n") fx = float(x) y = input("Please enter first number:\n") fy = float(y) print(f' % = ')
Когда мы получаем данные, введенные пользователем, они имеют форму строки. Мы используем встроенную функцию float() для преобразования их в числа с плавающей запятой. Вот почему остаток равен 1,0, а не 1.
4. Пример ZeroDivisionError
Если делитель равен 0, оператор по модулю выдаст ZeroDivisionError . Мы можем использовать блок try-except, чтобы поймать ошибку.
5. По модулю с отрицательными числами
Оператор модуля Python всегда возвращает остаток, имеющий тот же знак, что и делитель. Это может привести к путанице с выводом.
6. Python Modulo math.fmod()
Поведение оператора% с отрицательными числами отличается от поведения библиотеки C. Если вы хотите, чтобы операция по модулю велась как программирование на C, вам следует использовать функцию fmod() математического модуля. Это рекомендуемая функция для получения чисел с плавающей запятой по модулю.
>>> import math >>> math.fmod(-5, 3) -2.0 >>> math.fmod(5, -3) 2.0 >>> math.fmod(-10, 3) -1.0 >>>
- fmod (-5, 3) = fmod (-2 -1 * 3, 3) = -2,0
- fmod (5, -3) = fmod (2-1 * -3, -3) = 2,0
- fmod (-10, 3) = fmod (-1-3 * 3, 3) = -1,0
Перегрузка оператора по модулю
Мы можем перегрузить оператор по модулю, реализовав __mod__() в нашем определении класса.
class Data: def __init__(self, i): self.id = i def __mod__(self, other): print('modulo function called') return self.id % other.id def __str__(self): return f'Data[]' d1 = Data(10) d2 = Data(3) print(f' % = ')
modulo function called Data[10] % Data[3] = 1
Коротко о проблемах арифметики с плавающей запятой
Мы используем двоичный формат для хранения значений в компьютерах. Что касается дробей, в большинстве случаев мы не можем представить их в точности как двоичные дроби. Например, 1/3 не может быть представлена в точном двоичном формате, и это всегда будет приблизительное значение.
Вот почему вы можете получить неожиданные результаты при выполнении арифметических операций с числами с плавающей запятой. Это ясно из вывода нижеприведенных операций по модулю.
На выходе должно быть 0, потому что 3,2 * 3 равно 9,6. Но значения долей с плавающей запятой не представлены точно, и приближение вызывает эту ошибку. Это тоже видно из этого примера.
Таким образом, вы должны проявлять особую осторожность при работе с числами с плавающей запятой. Желательно выполнить округление, а затем сравнить только два числа с плавающей запятой.
>>> round(9.6, 3) == round(3.2 * 3, 3) True