我想了解为什么零填充对printf中的%g和%f格式的工作方式不同。这是一个示例程序:
#include <stdio.h>
int main()
{
double d = 0.10000000000001;
printf("%04.2f\n", d);
printf("%04.2g\n", d);
return 0;
}
输出
0.10
00.1
这在Windows上的VC ++和Linux上的gcc中都是可重现的。
为什么它会像这样?这是正确的行为吗?
更新:我找到了答案,但我想我会把问题打开......
答案 0 :(得分:3)
这是对的。根据C99 7.19.6.1/8中的样式g
的规范:
除非使用#标志,否则从结果的小数部分删除任何尾随零,如果没有剩余小数部分,则删除小数点字符
虽然样式f
未指定删除尾随零。
答案 1 :(得分:1)
使用%g时,printf会选择在最小位置提供最佳精度的格式。您可以猜测它是如何评估精度的,因为对于d = 0.10500000,它打印“00.1”,而对于d = 0.10500001,它打印“0.11”。
答案 2 :(得分:0)
您可以通过std :: cout对象上的同名成员函数来控制宽度和精度。
来自http://en.cppreference.com/w/cpp/io/basic_ostream的文档 精确 管理浮点运算的小数精度 (std :: ios_base的公共成员函数) 宽度 管理字段宽度 (std :: ios_base的公共成员函数)