我已经在该网站上阅读了一些答案,并认为该printf
取整是可取的。
但是,当我在实践中使用它时,一个细微的错误导致我出现以下行为:
$ echo 197.5 | xargs printf '%.0f'
198
$ echo 196.5 | xargs printf '%.0f'
196
$ echo 195.5 | xargs printf '%.0f'
196
请注意,舍入196.5
变为196
。
我知道这可能是一些微妙的浮点错误(但这不是一个很大的数目,对吧?),所以有人可以对此加以说明吗?
也非常欢迎此问题的一种解决方法(因为我现在尝试将其用于工作)。
正如预期的那样,它是“四舍五入”或“银行家的四舍五入”。
一个相关网站的答案解释。
该规则试图解决的问题是(对于具有一位小数的数字),
那是4下降4上升。
为了保持四舍五入的平衡,我们需要对x.5进行四舍五入
这是通过以下规则完成的:«舍入到最接近的“偶数”»。
在代码中:
sh LC_NUMERIC=C printf '%.0f ' "$value"
awk echo "$value" | awk 'printf( "%s", $1)'
总的来说,有四种可能的方法可以对数字进行四舍五入:
如果您确实需要“向上舍入(朝+infinite
)”,则可以使用awk:
value=195.5
awk echo "$value" | awk '{ printf("%d", $1 + 0.5) }'
bc echo "scale=0; ($value+0.5)/1" | bc
如果您确实需要“向下舍入(Toward -infinite
)”,则可以使用:
value=195.5
awk echo "$value" | awk '{ printf("%d", $1 - 0.5) }'
bc echo "scale=0; ($value-0.5)/1" | bc
删除小数点(点后的所有内容)。
我们还可以直接使用外壳程序(适用于大多数外壳程序-是POSIX):
value="127.54" ### Works also for negative numbers.
壳牌 echo "${value%%.*}"
awk echo "$value"| awk '{printf ("%d",$0)}'
bc echo "scale=0; ($value)/1" | bc
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句