linux – 在Bash中使用bc舍入数字
发布时间:2020-12-13 19:14:52 所属栏目:Linux 来源:网络整理
导读:我想用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 但规模并不像我预期的那样.我该怎么做才能解
我想用bc计算一个带有3位小数的平均值,四舍五入到最接近的数字.
例如:
和
我试过了: 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 '%.*fn' "$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,这应该足够了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |