⚖️ Старый и современный подход

⚡ Различия в двух словах

Старый / учебный подход: from math import *, округление денег через round(), ручное округление через int(x + 0.5).

Современный подход: явный импорт import math, денежные расчёты через Decimal, math.floor/math.ceil/math.isclose в зависимости от задачи.

Вывод: избегайте «звёздочки» при импорте; не используйте float для денег; выбирайте функцию округления осознанно.

📜 Старый подход: from math import *

Учебные примеры иногда пишут from math import *, чтобы не указывать префикс math. перед каждой функцией. Это работает, но затрудняет понимание, откуда взялось то или иное имя.

from math import *

radius = 5
area = pi * radius ** 2
print(sqrt(area))

Риск: если в программе уже есть переменная pi или функция sqrt, импорт «звёздочкой» их затрёт.

✅ Современный подход: явный импорт

Явный импорт делает код понятнее: читатель сразу видит, что sqrt и pi пришли из модуля math.

import math

radius = 5
area = math.pi * radius ** 2
print(math.sqrt(area))
Преимущества:
  • Не засоряет глобальное пространство имён.
  • Проще искать определения функций.
  • Снижается риск случайных конфликтов имён.

📜 Старый подход: round() для денег

Для финансовых расчётов иногда пытаются обойтись встроенным round():

price = 0.1
total = price * 3
print(round(total, 2))   # иногда 0.3, но промежуточные шаги неточны

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

✅ Современный подход: Decimal

Для цен, налогов и валют используйте Decimal со строковыми аргументами.

from decimal import Decimal

price = Decimal('0.1')
total = price * 3
print(total)             # 0.3
print(total == Decimal('0.3'))  # True
Проверить по документации: раздел Decimal fixed point and floating point arithmetic объясняет, почему Decimal лучше подходит для финансовых приложений.

📜 Старый подход: ручное округление

Раньше для округления до ближайшего целого «в школу» использовали трюк int(x + 0.5). Он работает только для положительных чисел и ломается на отрицательных.

x = 2.7
print(int(x + 0.5))   # 3

x = -2.7
print(int(x + 0.5))   # -2, а ожидалось -3

✅ Современный подход: math.floor, math.ceil, round

Выбирайте функцию в зависимости от задачи:

import math

print(math.floor(2.7))   # 2  (округление вниз)
print(math.ceil(2.1))    # 3  (округление вверх)
print(round(2.5))        # 2  (банковское округление)
print(math.isclose(0.1 + 0.2, 0.3))  # True
💡 Правило: если нужно школьное округление «от нуля», напишите свою функцию на основе знака числа, или используйте Decimal с нужным режимом округления.

🕰️ Когда старый подход ещё встречается

from module import * и round() для денег можно встретить в старых учебниках и legacy-коде. Важно понимать, почему они работают, но в новых проектах стоит применять современные альтернативы.