2009-11-23 3 views
13

Рассмотрим:«Sprintf»: двойной точности в C

double a = 0.0000005l; 
char aa[50]; 
sprintf(aa, "%lf", a); 
printf("%s", aa); 

Output: s0.000000 

В приведенном выше фрагменте кода переменная aa может содержать только шесть десятичную точность. Я хотел бы получить выход типа «s0.0000005». Как мне это достичь?

+2

FYI, 0.0000005l - «длинный двойной», используйте только 0,0000005 для постоянной типа double. – progrmr

+0

Уже ответил: http://stackoverflow.com/questions/69743/how-to-use-f-to-populate-a-double-value-into-a-string-with-the-right-precision – progrmr

ответ

22

От вашего вопроса это, кажется, как вы используете C99, как вы использовали %lf для двойной.

Для того, чтобы достичь желаемого выходного заменить:

sprintf(aa, "%lf", a); 

с

sprintf(aa, "%0.7f", a); 

Общий синтаксис "%A.B" означает использование B цифр после запятой. Значение A более сложное, но его можно прочитать примерно here.

+9

''% A.B "' _ не имеет значения 'A' цифры до десятичной точки. 'A' - это ширина поля _ _. Это минимальная ширина символа всего напечатанного номера. Вывод дополняется пробелами (по умолчанию) по мере необходимости. – chux

+1

Я не уверен, почему этот ответ предлагает перейти от 'lf' к' f'. 'lf' - отлично подходящий спецификатор формата для' double'. Более того, в C99 было специально узаконено исправление, чем раздражающая несогласованность между спецификаторами формата в 'fscanf' и' fprintf'.Это означает, что 'lf' должно быть * предпочтительным * над' f' для значений 'double'. 'f' для' float'. – AnT

5

Вы должны написать его как sprintf(aa, "%9.7lf", a)

Выезд http://en.wikipedia.org/wiki/Printf еще несколько деталей о кодах формата.

+2

% lf для длинного двойного. % 9.7f следует использовать для двойника. – progrmr

+2

@ kk6yb: '% lf' не определено для C89 и такое же, как'% f' для C99 (где оба хороши для печати значений «double»). Для длинного двойника правильный спецификатор преобразования - '% Lf'. – pmg

+1

Точнее, в ''% X.Yf'' 'Y' представляет количество мест после отображения десятичной величины (по умолчанию 6), а' X' представляет минимальное количество отображаемых символов. В вашем случае 'X' не требуется, но вам нужно будет добавить' .Y', где 'Y' - количество десятичных знаков для печати. – bta

-1

Проблема с Sprintf

sprintf(aa,"%lf",a); 

% Л.Ф. говорит interpet "а" в качестве "длинных двойных" (16 байт), но это на самом деле "двойной" (8 байт). Используйте вместо этого:

sprintf(aa, "%f", a); 

Более подробную информацию here on cplusplus.com

+1

'% lf' не определено для C89 и такое же, как'% f' для C99. Для длинного двойника правильный спецификатор преобразования - '% Lf'. – pmg

+0

Это будет печатать 6 знаков после запятой - поэтому, скорее всего, будет напечатано 0,000000, а не 0,000001. Использование «% 9.7f» верно для 7 знаков после запятой. –

+0

Хммм, да, я не обращал внимания на десятичные знаки. Дело в том, что '% lf' ожидает' double' в C99; '% Lf' ожидает' long double'. – pmg

Смежные вопросы