Дробная часть
Отбрасываем целую часть положительного числа.
Как к ней подойти
Увидите, как целочисленные операции и вычисления с дробями помогают обойтись без лишних шагов.
Операции // и % помогают разделить число на целую часть и остаток. Для дробных вычислений следите за точностью и порядком действий: одно и то же число может требовать разного способа обработки.
Число читается как точная десятичная запись. Выделяем целую часть и вычитаем её, задав достаточно значащих цифр для исходного числа; поэтому длинная дробная часть не теряется.
Проверьте перед запуском
- 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).