Мини-урок · перед практикой

Дробная часть

Отбрасываем целую часть положительного числа.

Как к ней подойти

Увидите, как целочисленные операции и вычисления с дробями помогают обойтись без лишних шагов.

Коротко о теме

Операции // и % помогают разделить число на целую часть и остаток. Для дробных вычислений следите за точностью и порядком действий: одно и то же число может требовать разного способа обработки.

Ключевая идея · Точное вычитание целой части

Число читается как точная десятичная запись. Выделяем целую часть и вычитаем её, задав достаточно значащих цифр для исходного числа; поэтому длинная дробная часть не теряется.

Проверьте перед запуском

  • float не сохраняет маленькую дробную часть у очень большого целого.
  • Для положительного числа ответ лежит в промежутке [0, 1).

Сравните свой подход

Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.

Ваше принятое решение

Рекомендуемое решение: Точное вычитание целой части

Число читается как точная десятичная запись. Выделяем целую часть и вычитаем её, задав достаточно значащих цифр для исходного числа; поэтому длинная дробная часть не теряется.

from decimal import Decimal, localcontext, ROUND_DOWN
x = Decimal(input())
with localcontext() as context:
    context.prec = max(1, len(x.as_tuple().digits))
    fraction = x - x.to_integral_value(rounding=ROUND_DOWN)
print(fraction)

Время: O(L + E), где E — длина выводимого результата; для обычной записи O(L). Память: O(L + E).

Другой способ: Отделение дробной части строки

Переводим число в обычную десятичную запись и заменяем целую часть нулём. Арифметического округления нет; при больших показателях степени развёрнутая строка может быть длинной.

from decimal import Decimal
s = format(Decimal(input()), 'f')
fraction = s.partition('.')[2]
print('0.' + fraction if fraction else '0')

Время: O(L + E), E — длина развёрнутой записи. Память: O(L + E).