Решение отличное, но возникала проблема при обработке целых чисел.
Для числа 12 ответ выглядел таким образом: "12."
Чтобы решить проблему, пришлось добавить еще один rtrim: rtrim(rtrim(sprintf('%.16f', $a), '0'), '.')
Конвертни экспоненциальное выражение в строку, аналогом split'а разбей строку по регулярке "E", посчитай результат как arr[0] * 10^arr[1]. И снова конвертни в строку.