为什么printf("%.6g,<value>)在小数点后忽略零?

Sho*_*You 4 c floating-point precision double printf

我想在小数点后打印最多6位数,所以我使用了以下内容:

printf("%.6g",0.127943989);
Run Code Online (Sandbox Code Playgroud)

输出printf是0.127944这是正确的,但当我尝试这个:

printf("%.6g",0.007943989);
Run Code Online (Sandbox Code Playgroud)

输出变为0.00794399,这不是我期望看到的!

似乎printf在小数点后忽略零.那么如何强制它输出最大6位精度?

Mic*_*urr 5

"%f"格式说明符:

printf("%.6f\n",0.007943989)  // prints 0.007944
Run Code Online (Sandbox Code Playgroud)

你在找什么?请记住,%e如果数字保证,这不会自动切换到格式样式,因此这可能不是您正在寻找的.

例如,以下内容:

printf("%.6g\n",0.00007943989);
printf("%.6f\n",0.00007943989);
Run Code Online (Sandbox Code Playgroud)

打印:

7.94399e-005
0.000079
Run Code Online (Sandbox Code Playgroud)

并且不清楚你是否想要提供的较小数字的指数形式"%g".

请注意,规范%f%g处理精度规范的行为略有不同.

  • for %f:"小数点字符后的位数等于精度规格"
  • for %g:"精度指定有效位数"

并且小数点后的零运行不计入有效数字(这表示您看到的行为%g).

  • 嗯,这可能是一种更好的方法,但是由于我在浮点数方面不太明亮,我可能会使用`%f`和`snprintf()`来格式化这个东西,然后去除尾随的零.或类似的东西.但就像我说的,有人可能知道更好的方式...... (3认同)