Дробная часть
Вы решили задачу. Теперь можно сравнить подходы.
Отбрасываем целую часть положительного числа.
Авторский разбор для локальной версии на основе условия задачи. Это не выгрузка чужих посылок и не официальное решение исходного сайта.
Ваше принятое решение
Рекомендуемое решение: Точное вычитание целой части
Число читается как точная десятичная запись. Выделяем целую часть и вычитаем её, задав достаточно значащих цифр для исходного числа; поэтому длинная дробная часть не теряется.
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).
На что обратить внимание
- float не сохраняет маленькую дробную часть у очень большого целого.
- Для положительного числа ответ лежит в промежутке [0, 1).
Рекомендация учитывает сложность и читаемость для этой задачи. Единственного самого быстрого решения для всех размеров входа и всех компьютеров может не быть.