Answers:
“舍入浮点数”是什么意思?
显然,这很容易...我上学的数学书在哪里...
不,我们已经知道与浮点数无关的任何事情都不容易:
首先,有多种舍入模式:
向上舍入?
向下舍入?
舍入为零?
四舍五入到最接近的-平整的关系?
四舍五入到最接近的-领带距离零?
如何处理极端情况?如何找出哪些极端情况?
好的,看起来我们最好使用IEEE 754标准的实现,然后让我们的系统来处理。
要基于标准浮点算法在外壳中舍入一个浮点数,我们需要三个步骤:
事实证明,shell命令printf
可以完成所有这一切。它可以根据中所述的格式规范来打印数字man 3 printf
。如果输出格式需要数字,则以标准方式隐式舍入数字:
使用输入作为命令行参数x
将p
精度舍入为数字:
printf "%.*f\n" "$p" "$x"
或在Shell管道中,使用x
标准输入p
作为参数输入:
echo "$x" | xargs printf "%.*f\n" "$p"
例子:
$ printf '%.*f\n' 0 6.66
7
$ printf '%.*f\n' 1 6.66
6.7
$ printf '%.*f\n' 2 6.66
6.66
$ printf '%.*f\n' 3 6.66
6.660
$ printf '%.*f\n' 3 6.666
6.666
$ printf '%.*f\n' 3 6.6666
6.667
当心语言环境!.
如您所料,它指定了整数部分和分数部分之间的分隔符- 。
但是看看自己在德国语言环境中会发生什么,例如:
$ LC_ALL=de_DE.UTF-8 printf '%.*f\n' 3 6.6666
6,667
是的,没错6,667
-六个逗号六个六七个。那肯定会弄乱您的脚本。
(但仅适用于德国的两个客户。除了目前正在为这些客户进行调试的开发人员的机器。)
要使其更强大,请使用:
LC_ALL=C /usr/bin/printf "%.*f\n" "$p" "$x"
要么
echo "$x" | LC_ALL=C xargs /usr/bin/printf "%.*f\n" "$p"
这也可以/usr/bin/printf
代替内置的shell bash
或zsh
解决printf
变体实现中的细微不一致,并防止在德国语言环境LC_ALL
中设置但未导出时产生非常脏的效果。然后,内置的用途,
和/usr/bin/printf
使用.
...
另请参见%g
有关四舍五入到指定数量的有效数字的信息。
awk
。