为什么printf圆形浮点数?

时间:2014-06-09 13:01:38

标签: c floating-point printf

我正在尝试使用printf打印一些浮点数。 例如:

int main()
{
    printf("%.1f",76.75); 
    return 0;
}

输出:76.8

我对结果有一些疑问。

首先,为什么不打印76.7?

其次,它是如何围绕数字的呢?

3 个答案:

答案 0 :(得分:12)

除了现有的答案之外,请注意许多C编译器尝试遵循IEEE 754的浮点问题。 IEEE 754建议根据当前舍入模式舍入从二进制浮点到十进制的转换。默认的舍入模式是“舍入到最近并且与偶数相关”。某些编译平台不考虑舍入模式,并且在从浮点到十进制的转换中始终根据默认的最近偶数模式进行舍入。

由于76.75完全代表数字7675/100,因此恰好在76.7和76.8之间。当应用“round to nearest-even”时,后一个数字被认为是“偶数”。这可能是您的编译平台选择生成此十进制表示形式作为浮点数76.75的十进制转换的原因。

答案 1 :(得分:9)

  

C99§7.19.6.1fprintf函数

     

fF

     

表示浮点数的double参数在样式[−]ddd.ddd中转换为十进制表示法,其中小数点字符后面的位数等于精度规范。如果缺少精度,则取6;如果精度为零且未指定#标志,则不会显示小数点字符。如果出现小数点字符,则在其前面至少出现一个数字。 该值四舍五入为适当的位数。

答案 2 :(得分:6)

  

首先,他为什么不打印76.7?

因为语言规范说低位数将被舍入。

  

他如何舍入这个数字? (一些代码会有所帮助)

这与实施的实施方式不同。根据{{​​3}},

  

低位数字应以实现定义的方式舍入(强调添加)。