为什么printf圆形浮点数?

Mal*_*dom 14 c floating-point printf

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

int main()
{
    printf("%.1f",76.75); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:76.8

我对结果有一些疑问.

首先,为什么不打印76.7?

第二,它是如何围绕这个数字的呢?

Pas*_*uoq 12

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

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

  • @tmyklebu Mac OS X.即使更改了舍入模式,Linux总是会舍入到最近 - 偶数.http://pastebin.com/p3myWBQU(在Mac OS X上获得).微软的编译器比舍入方向有更大的问题,所以我认为没有人关心这一点. (2认同)
  • @tmyklebu:总是愿意学习新的东西,那么到底是什么呢?你有链接吗? (2认同)

Yu *_*Hao 10

C99§7.19.6.1该fprintf功能

f,F

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

  • 啊,但是“圆角”是什么意思?人们可能天真地认为它意味着“到最近的”,有 0.5 左右的一些回旋余地,但请注意,C 标准定义了四种不同的舍入模式(参考 7.6),并且核心标准拒绝指定默认值,因此它不是明确其中“圆角”指的是哪一个。如果您认为它遵循舍入模式(标准不要求),那么您会在杂草深处找到F.7.3(C99,C11和C17中的F.8.3),它指定默认舍入模式是“to最近”。 (2认同)

das*_*ght 7

首先,为什么他没有打印76.7?

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

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

这与实现的实现不同.根据文件,

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