Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 为什么printf(Unix)使用舍入一半?_Bash_Unix_Printf - Fatal编程技术网

Bash 为什么printf(Unix)使用舍入一半?

Bash 为什么printf(Unix)使用舍入一半?,bash,unix,printf,Bash,Unix,Printf,为什么printf的行为如此不寻常 > printf %.0f 2.5 > 2 > printf %.0f 2.51 > 3 这种行为是否有弥补可能产生的误解的优势(如)?严格来说,这不是四舍五入: > printf '%.0f\n' 2.5 2 > printf '%.0f\n' 3.5 4 这是一种舍入形式,用于在对大量值进行舍入时消除偏见;其中大约一半将向下取整,另一半将向上取整。规则是,如果整数部分为偶数,则向下舍入;如果整数部分为奇数,则向上舍入

为什么printf的行为如此不寻常

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

这种行为是否有弥补可能产生的误解的优势(如)?

严格来说,这不是四舍五入:

> printf '%.0f\n' 2.5
2
> printf '%.0f\n' 3.5
4
这是一种舍入形式,用于在对大量值进行舍入时消除偏见;其中大约一半将向下取整,另一半将向上取整。规则是,如果整数部分为偶数,则向下舍入;如果整数部分为奇数,则向上舍入



但是,这只是对特定舍入方案的解释,不能保证所有POSIX规范中的
printf
命令的
printf
实现都会使用该舍入方案:

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

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


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

f、 f

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

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


bash printf,还是UNIX(又称操作系统的)printf?它们是两个不同的命令——前者是一个shell内置命令,而后者是
/usr/bin/printf
,不包括bash内置命令,如
%q
。它真的是四舍五入还是四舍五入?后者更常见,对于
2.5
,两种舍入策略给出相同的结果。尝试
printf3.5
。我使用的是/usr/bin/printf。这实际上更多的是对问题的评论;撇开标准不谈,OP的
printf
(无论是哪一个)确实支持
%f
,问题是关于观察到的行为。我对你的答案投了赞成票——这是一个很好的答案——但如果没有讨论工具必须遵守的标准(如果有),任何关于“为什么”的答案都是不完整的,以及这些标准是否解决了手头的行为。我使用这个printf实用程序格式化bc输出,所以这个答案对我也有帮助!现在我将使用awk。