linux – 在Bash中使用bc舍入数字

我想用bc计算一个带有3位小数的平均值,四舍五入到最接近的数字.

例如:

average of 3,3 and 5 should yield 3.667

average of 3,3 and 4 should yield 3.333

我试过了:

echo "scale=3; $sum/$n+0.0005" | bc

但规模并不像我预期的那样.我该怎么做才能解决我的问题?

解决方法

你添加0.0005的技巧并不是一个坏主意.虽然,它并没有那么好用.当bc执行某些操作(如分区)时,内部使用scale.

在你的情况下,最好先执行除法,可能使用大规模或-l切换到bc1(如果你的版本支持它),然后加0.0005然后设置scale = 3并执行涉及内部扩展的操作执行截断.

就像是:

`a=$sum/$n+0.0005; scale=3; a/1`

当然,无论总和是正数还是负数,您都希望以不同方式进行.幸运的是,bc有一些条件运算符.

`a=$sum/$n; if(a>0) a+=0.0005 else if (a<0) a-=0.0005; scale=3; a/1`

然后,您将要使用printf格式化此答案.

包含在函数回合中(您可以选择小数位数):

round() {
    # $1 is expression to round (should be a valid bc expression)
    # $2 is number of decimal figures (optional). Defaults to three if none given
    local df=${2:-3}
    printf '%.*f\n' "$df" "$(bc -l <<< "a=$1; if(a>0) a+=5/10^($df+1) else if (a<0) a-=5/10^($df+1); scale=$df; a/1")"
}

试试吧:

gniourf$round "(3+3+4)/3"
3.333
gniourf$round "(3+3+5)/3"
3.667
gniourf$round "-(3+3+5)/3"
-3.667
gniourf$round 0
0.000
gniourf$round 1/3 10
0.3333333333
gniourf$round 0.0005
0.001
gniourf$round 0.00049
0.000

1使用-l开关,比例设置为20,这应该足够了.

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...