是否可以在 shell 脚本中使用 dc 来舍入堆栈顶部? 如果是,是否有命令将结果向上和向下舍入?
谢谢大家!
最佳答案
Most arithmetic operations are affected by the "precision value", which you can set with the
k
command. The default precision value is zero ...
/
Pops two values, divides the second one popped from the first one popped, and pushes the result. The number of fraction digits is specified by the precision value.
因此您可以使用0k1/
截断(向零舍入) ,或者只是1/
如果您知道默认精度为 0。例如:
$ dc -e '12.9 1/ p'
12
$ dc -e '_12.9 1/ p'
-12
其他类型的舍入更加困难。要舍入到最接近的整数,您可以使用 [_1*]sad.5r0>a+0k1/
,例如:
$ dc -e '12.9 [_1*]sad.5r0>a+0k1/ p'
13
$ dc -e '_12.9 [_1*]sad.5r0>a+0k1/ p'
-13
快速解释:
-
[_1*]sa
存储命令_1*
(乘以-1)在寄存器a
中. -
d
复制堆栈顶部的值(我们要舍入的值,称之为v)。 -
.5r
压入 0.5,然后交换顶部的两个值,因此堆栈现在为 v 0.5 v。 -
0>a
执行寄存器a
中的命令如果 0 > v(即,如果 v 为负数)。如果 v 为正,则堆栈现在为 0.5 v;如果 v 为负,则堆栈现在为 −0.5 v。< -
+
将前两个值相加,如果 v 为正,则插入 v + 0.5;如果 v 为正,则插入 v − 0.5是否定的。 -
0k1/
如上所述进行截断。
如果您知道要舍入的数字是非负数,则可以使用 .5+0k1/
;如果您还知道精度为 0,则可以使用 .5+1/
.
要向下舍入,请使用 [dX[1-]sa0<a]sad0>a0k1/
.
要向上舍入,请使用 [dX[1+]sa0<a]sad0<a0k1/
.
所有这些建议都使用寄存器 a
,因此您可能需要在实际程序中调整它们。
关于使用 dc 对结果进行四舍五入(桌面计算器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19322233/