← Назад к вопросам

Что такое дробное число в Python?

2.0 Middle🔥 181 комментариев
#Другое

Комментарии (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 для точности!

Что такое дробное число в Python? | PrepBro