Гуглите GRISU2 — и, возможно, переделайте этот код под свои нужды.
Он работает на целой арифметике и делает вот что: находит самое круглое десятичное число, переводимое в компьютерное дробное x.
Допустим, мне приходилось добавлять такое.
1. В случае не очень большого числа, большего 1/относительная_погрешность — поднять точность до единиц.
Например, переходить в экспоненциальный формат, когда у нас больше 5 цифр, а точность 3 цифры — то 0,00123, 0,0123, 0,123, 1,23, 12,3, 123, 1234, 12345, 1,23e5.
2. Большее из абсолютной и относительной погрешности.
Если у нас ещё две цифры абсолютной погрешности — то 0, 0,01, 0,12, 1,23, 12,3…
3. Формат с фиксированной длиной дробной части по принципу «всё или ничего».
С теми же двумя цифрами абсолютной погрешности — 0, 0,01, 0,12, 1,23, 12,34, 123…
4. Работу с локалями.