使用 dc 对结果进行四舍五入(桌面计算器)

标签 rounding dc

是否可以在 shell 脚本中使用 dc 来舍入堆栈顶部? 如果是,是否有命令将结果向上和向下舍入?

谢谢大家!

最佳答案

dc manual说:

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. [_1*]sa存储命令_1* (乘以-1)在寄存器 a 中.
  2. d复制堆栈顶部的值(我们要舍入的值,称之为v)。
  3. .5r压入 0.5,然后交换顶部的两个值,因此堆栈现在为 v 0.5 v
  4. 0>a执行寄存器a中的命令如果 0 > v(即,如果 v 为负数)。如果 v 为正,则堆栈现在为 0.5 v;如果 v 为负,则堆栈现在为 −0.5 v。<
  5. +将前两个值相加,如果 v 为正,则插入 v + 0.5;如果 v 为正,则插入 v − 0.5是否定的。
  6. 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/

相关文章:

rust - LLVM 优化器不尊重使用 Rust 内联 asm 设置非默认舍入模式?

forth - 使用 GNU dc 更改为水平堆栈显示?

cygwin - 在 Cygwin 中安装 dc

bash - dc(1) 和前导零

.net - CInt 不会一致地舍入 Double 值 - 如何删除小数部分?

python - 如何在 TensorFlow 中模拟降低精度的 float ?

optimization - 有效地将无符号值除以 2 的幂,四舍五入 - 在 CUDA 中

javascript - 如何在 JavaScript 中四舍五入为整数?