【问题标题】:'sprintf': double precision in C'sprintf':C 中的双精度
【发布时间】:2009-11-23 22:27:52
【问题描述】:

考虑:

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

Output: s0.000000

在上面的代码sn-p中,变量aa只能包含六位小数精度。我想得到像“s0.0000005”这样的输出。我如何做到这一点?

【问题讨论】:

标签: c


【解决方案1】:

从您的问题来看,您似乎使用的是 C99,因为您已将 %lf 用于双精度。

要实现所需的输出替换:

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

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

一般语法"%A.B" 表示使用小数点后的B 位。 A的含义比较复杂,不过可以看一下here

【讨论】:

  • "%A.B" 表示A小数点前的数字。 A“字段宽度”。它是整个打印数字的最小字符宽度。输出根据需要用空格(默认)填充。
  • 我不确定为什么这个答案建议从 lf 切换到 flfdouble 的完美格式说明符。此外,它在 C99 中被合法化,专门用于修复 fscanffprintf 中格式说明符之间令人讨厌的不一致问题。这意味着对于double 值,lf 应该首选而不是ff 代表float
【解决方案2】:

你需要写成sprintf(aa, "%9.7lf", a)

查看http://en.wikipedia.org/wiki/Printf 了解有关格式代码的更多详细信息。

【讨论】:

  • %lf 用于长双精度。 %9.7f 应该用于双精度。
  • @kk6yb: %lf 对于 C89 未定义,与 %f 对于 C99 相同(两者都可以打印 double 值)。对于 long double,正确的转换说明符是 %Lf
  • 更准确地说,在'%X.Yf' 中,Y 表示要显示的小数点后的位数(默认为 6),X 表示要显示的最小字符数。在您的情况下,X 不是必需的,但您需要添加 .Y 其中Y 是要打印的小数位数。
  • @pmg:你是对的,%Lf 是长双打。它与文字常量不同,其中 0.0l 和 0.0L 都指定一个长双精度字面值。
【解决方案3】:

问题在于 sprintf

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

%lf 说将“a”解释为“long double”(16 个字节),但它实际上是一个“double”(8 个字节)。改用这个:

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

更多详情here on cplusplus.com

【讨论】:

  • %lf 对于 C89 未定义,与 %f 对于 C99 相同。对于 long double,正确的转换说明符是 %Lf
  • 这将打印 6 个小数位 - 所以它很可能会打印 0.000000 而不是 0.000001。小数点后 7 位使用 "%9.7f" 是正确的。
  • 嗯,是的,我没有注意小数位。重点是 %lf 在 C99 中需要 double%Lf 需要 long double
  • @pmg:由于传递了一个双精度数(即使 'a' 是浮点数也是如此),我可以看到使用“%9.7lf”没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 2015-12-17
  • 2015-05-30
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多