为什么printf(Unix)使用下半轮?

时间:2016-07-12 13:42:17

标签: bash unix printf

为什么printf以这种不寻常的方式表现?

> printf %.0f 2.5
> 2
> printf %.0f 2.51
> 3

这种行为是否有利于弥补可能的误解(如this one)?

2 个答案:

答案 0 :(得分:4)

这不是严格的四舍五入:

> printf '%.0f\n' 2.5
2
> printf '%.0f\n' 3.5
4

如果要舍入大量值,这是一种用于抵制偏见的舍入形式;其中大约一半将向下舍入,另一半向上舍入。规则是,如果整数部分是偶数,则向下舍入,如果整数部分是奇数,则向上舍入。

然而,这仅是对特定舍入方案的解释,并不保证printf的所有实现都使用该方案。

答案 1 :(得分:0)

来自printf命令的POSIX规范:

  

不需要printf()的浮点格式转换规范,因为shell中的所有算术都是整数运算。 awk实用程序执行浮点计算并提供自己的printf函数。 bc实用程序可以执行任意精度的浮点运算,但不提供广泛的格式化功能。 (此printf实用程序实际上不能用于格式化bc输出;它不支持任意精度。)鼓励实现支持将浮点转换作为扩展。

因此:%f 甚至不需要存在;任何它可能做或不做的事情都完全没有被相关标准规定。

同样,对printf()函数的POSIX标准提供的舍入没有指导:

  

f,F

     

双参数应转换为“[ - ] ddd.ddd”样式的十进制表示法,其中基数字符后面的位数等于精度规格。如果缺少精度,则应视为6;如果精度明确为零且没有'#'标志,则不会出现基数字符。如果出现基数字符,则在其前面至少出现一个数字。 低位数字应以实现定义的方式舍入。

     

表示无穷大的双参数应以“[ - ] inf”或“[ - ] infinity”之一转换;哪种样式是实现定义的。表示NaN的双参数应以“[ - ] nan(n-char-sequence)”或“[ - ] nan”的样式之一进行转换;哪种样式,以及任何n-char序列的含义,都是实现定义的。 F转换说明符分别产生“INF”,“INFINITY”或“NAN”而不是“inf”,“infinity”或“nan”。