Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Дробные числа в Python
Дробное число — это число, представляющее часть целого. В Python есть несколько типов для работы с дробями: float, Decimal и fractions.Fraction.
Float — вещественные числа
Базовое использование
# Дробные числа (float)
x = 3.14
y = 2.5
z = -0.5
print(type(x)) # <class 'float'>
print(x + y) # 5.64
Экспоненциальная нотация
# Научная нотация
a = 1.5e2 # 1.5 * 10^2 = 150.0
b = 2.5e-1 # 2.5 * 10^-1 = 0.25
c = 1.23e3 # 1.23 * 10^3 = 1230.0
print(a) # 150.0
print(b) # 0.25
print(c) # 1230.0
Специальные значения
import math
# Бесконечность
inf = float('inf')
print(inf + 100) # inf
print(1 / inf) # 0.0
# Отрицательная бесконечность
neginf = float('-inf')
print(neginf < -999) # True
# NaN (Not a Number)
nan = float('nan')
print(nan == nan) # False (NaN не равен даже себе!)
print(math.isnan(nan)) # True
Проблема: точность Float
Float использует двоичное представление
# Основная проблема: не все десятичные дроби представимы в двоичном виде
x = 0.1 + 0.2
print(x) # 0.30000000000000004 (ошибка!)
print(x == 0.3) # False
# Почему?
# 0.1 в двоичном = 0.0001100110011... (бесконечная дробь)
# 0.2 в двоичном = 0.0011001100110... (бесконечная дробь)
# Округление при сложении даёт ошибку
Как сравнивать float
import math
x = 0.1 + 0.2
# ПЛОХО
if x == 0.3:
print("Равны") # Никогда не выполнится
# ХОРОШО
if math.isclose(x, 0.3):
print("Примерно равны") # Выполнится
# ХОРОШО (вручную)
if abs(x - 0.3) < 1e-9:
print("Разница меньше эпсилон") # Выполнится
Decimal — точные десятичные числа
Для финансовых вычислений
from decimal import Decimal
# Финансовый расчёт
price_per_item = Decimal('2.99')
quantity = 3
total = price_per_item * quantity
print(total) # 8.97 (точно!)
print(type(total)) # <class 'decimal.Decimal'>
Сравнение Float vs Decimal
from decimal import Decimal
# Float — неточное
float_result = 0.1 + 0.2
print(float_result) # 0.30000000000000004
# Decimal — точное
decimal_result = Decimal('0.1') + Decimal('0.2')
print(decimal_result) # 0.3
# Проверка
print(float_result == 0.3) # False (ошибка float)
print(decimal_result == Decimal('0.3')) # True (точно)
Параметры Decimal
from decimal import Decimal, getcontext
# Установить точность (по умолчанию 28 знаков)
getcontext().prec = 6
x = Decimal('1') / Decimal('3')
print(x) # 0.333333 (6 знаков)
# Режимы округления
from decimal import ROUND_HALF_UP, ROUND_DOWN
getcontext().rounding = ROUND_HALF_UP # Стандартное округление
x = Decimal('2.5')
print(x.quantize(Decimal('1'))) # 3
getcontext().rounding = ROUND_DOWN # Округление вниз
print(x.quantize(Decimal('1'))) # 2
Fractions — дроби
Точное представление дробей
from fractions import Fraction
# Создание дроби
f1 = Fraction(1, 3) # 1/3
f2 = Fraction(2, 5) # 2/5
print(f1) # 1/3
print(f2) # 2/5
print(f1 + f2) # 11/15 (точная сумма!)
Операции с дробями
from fractions import Fraction
a = Fraction(1, 2) # 1/2
b = Fraction(1, 3) # 1/3
print(a + b) # 5/6
print(a - b) # 1/6
print(a * b) # 1/6
print(a / b) # 3/2
print(a ** 2) # 1/4
Конвертация между типами
from fractions import Fraction
from decimal import Decimal
# Float → Fraction
f = Fraction(0.25)
print(f) # 1/4
# Decimal → Fraction
d = Decimal('0.75')
f = Fraction(d)
print(f) # 3/4
# Fraction → Float
f = Fraction(1, 3)
print(float(f)) # 0.3333333333333333
# Fraction → Decimal
from decimal import Decimal
f = Fraction(1, 3)
print(Decimal(f.numerator) / Decimal(f.denominator)) # 0.3333333333333333
Практические примеры
Финансовые расчёты (правильно)
from decimal import Decimal
def calculate_total_price(items):
"""Расчёт с точностью до копейки"""
total = Decimal('0')
for price, quantity in items:
# Берём Decimal, не float!
price_decimal = Decimal(str(price))
total += price_decimal * quantity
return total
items = [
(Decimal('2.99'), 3), # 3 товара по 2.99
(Decimal('5.50'), 2), # 2 товара по 5.50
]
print(calculate_total_price(items)) # 20.97 (точно!)
Инженерные вычисления (можно float)
import math
def calculate_circle_area(radius):
"""Площадь круга"""
return math.pi * radius ** 2
area = calculate_circle_area(5.0)
print(f"Площадь: {area:.2f}") # 78.54 (достаточно точно)
Работа с процентами
from decimal import Decimal
def apply_discount(price, discount_percent):
"""Применить скидку"""
price = Decimal(str(price))
discount = Decimal(str(discount_percent))
return price * (Decimal('100') - discount) / Decimal('100')
original_price = Decimal('99.99')
discount = Decimal('10') # 10%
final_price = apply_discount(original_price, discount)
print(f"Исходная: {original_price}")
print(f"Скидка: {discount}%")
print(f"Итоговая: {final_price}") # 89.99
Когда использовать что
Float
- Быстрые вычисления
- Инженерные расчёты
- Машинное обучение
- Графика
Decimal
- Финансы (деньги, цены)
- Бухгалтерия
- Медицина (дозы)
- Любые данные, где нужна точность
Fraction
- Математические расчёты
- Научные данные
- Точное представление дробей
- Когда важен результат в виде дроби
Форматирование дробных чисел
x = 3.14159265359
# Количество знаков после запятой
print(f"{x:.2f}") # 3.14
print(f"{x:.4f}") # 3.1416
print(f"{x:.0f}") # 3
# Процент
rate = 0.256
print(f"{rate:.1%}") # 25.6%
# Экспоненциальная нотация
print(f"{x:.2e}") # 3.14e+00
# Разделитель тысяч
big_num = 1234567.89
print(f"{big_num:,.2f}") # 1,234,567.89
Ошибка которую делают новички
# ПЛОХО: сравнение float
if price == 99.99:
print("Цена правильная") # Может не выполниться!
# ХОРОШО: сравнение Decimal
if price == Decimal('99.99'):
print("Цена правильная") # Гарантированно работает
Дробные числа в Python — это не просто синтаксис, это ответственность разработчика выбрать правильный тип для каждой задачи. Выбери float для скорости, но используй Decimal для точности!