我对这种行为感到困惑printf("%f", M_PI).它打印出来3.141593,但是M_PI是3.14159265358979323846264338327950288.为什么printf会这样做,如何让它打印出整个浮动.我知道%1.2f格式说明符,但如果我使用它们然后我得到一堆未使用的0并且输出很难看.我想要浮子的整个精度,但不是额外的任何东西.
Grz*_*ski 10
为什么printf会这样做,如何让它打印出整个浮动.
默认情况下,该printf()函数采用6for %f和%Fformat说明符的精度.从C11(N1570)§7.21.6.1/p8 fprintf函数(强调我的前进):
如果缺少精度,则取6 ; 如果精度为零且未指定#flag,则不显示小数点字符.如果出现小数点字符,则在其前面至少出现一个数字.该值四舍五入到适当的位数.
因此,呼叫等同于:
printf("%.6f", M_PI);
Run Code Online (Sandbox Code Playgroud)
这与"整个浮动"完全不同,至少不像你想象的那样直接.的double对象很可能被存储在二进制IEEE-754双精度表示.您可以使用%a或%A格式说明符查看确切的表示形式,将其打印为十六进制浮点数.例如:
printf("%a", M_PI);
Run Code Online (Sandbox Code Playgroud)
将其输出为:
0x1.921fb54442d18p+1
Run Code Online (Sandbox Code Playgroud)
你可以认为它是"整个浮动".
如果所有你需要的是"最长的十进制近似值",这是有道理的,然后使用DBL_DIG从<float.h>头.C11 5.2.4.2.2/p11 浮动类型的特征:
小数位数q,使得带有q个十进制数字的任何浮点数可以舍入为 p个基数为b 的浮点数,然后再返回而不更改为q个十进制数字
例如:
printf("%.*f", DBL_DIG-1, M_PI);
Run Code Online (Sandbox Code Playgroud)
可以打印:
3.14159265358979
Run Code Online (Sandbox Code Playgroud)