Лучший вариант: использовать шестнадцатеричный формат с плавающей запятой C99:
printf("%a", someDouble);
Строки, созданные таким образом, могут быть преобразованы обратно в double
с помощью функции C99 strtod( )
, а также с функциями scanf( )
. Несколько других языков также поддерживают этот формат. Некоторые примеры:
decimal number %a format meaning
--------------------------------------------
2.0 0x1.0p1 1.0 * 2^1
0.75 0x1.8p-1 1.5 * 2^-1
Преимущество шестнадцатеричного формата в том, что все представления точны . Таким образом, преобразование строки обратно в число с плавающей запятой всегда даст исходное число, даже если кто-то изменит режим округления, в котором выполняется преобразование. Это не относится к неточным форматам.
Если вы не хотите использовать шестнадцатеричный формат по какой-либо причине и хотите предположить, что режим округления всегда будет округляться до ближайшего (по умолчанию), тогда вы можете избежать форматирования данных в виде десятичных дробей с помощью не менее 17 значащих цифр. Если у вас есть правильно округленная процедура преобразования (в большинстве, но не во всех платформах), это гарантирует, что вы можете совершить круговое путешествие от двойного до струнного и обратно без потери точности.