Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在Bash中用bc取整数字_Linux_Bash_Bc - Fatal编程技术网

Linux 在Bash中用bc取整数字

Linux 在Bash中用bc取整数字,linux,bash,bc,Linux,Bash,Bc,我想使用bc计算3位小数的平均值,四舍五入到最接近的数值 例如: 3、3和5的平均值应为3.667 及 3、3和4的平均值应为3.333 我试过: echo "scale=3; $sum/$n+0.0005" | bc 但是scale的行为并不像我预期的那样。我能做些什么来解决我的问题?你添加0.0005的技巧不是个坏主意。尽管如此,这种方式并不十分有效scale 在您的情况下,最好先执行除法,可能使用较大的刻度或-l切换到bc1(如果您的版本支持),然后添加0.0005,然后设置scale=

我想使用
bc
计算3位小数的平均值,四舍五入到最接近的数值

例如:

3、3和5的平均值应为3.667

3、3和4的平均值应为3.333

我试过:

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

但是
scale
的行为并不像我预期的那样。我能做些什么来解决我的问题?

你添加
0.0005
的技巧不是个坏主意。尽管如此,这种方式并不十分有效<当
bc
执行某些操作(如分割)时,在内部使用code>scale

在您的情况下,最好先执行除法,可能使用较大的
刻度
-l
切换到
bc
1(如果您的版本支持),然后添加
0.0005
,然后设置
scale=3
,并在内部执行涉及
scale
的操作以执行截断

比如:

`a=$sum/$n+0.0005; scale=3; a/1`
当然,无论
sum
是正值还是负值,您都希望以不同的方式处理。幸运的是,
bc
有一些条件运算符

`a=$sum/$n; if(a>0) a+=0.0005 else if (a<0) a-=0.0005; scale=3; 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
,这应该足够了。

下一个函数将参数“x”四舍五入到“d”位:

define r(x, d) {
    auto r, s

    if(0 > x) {
        return -r(-x, d)
    }
    r = x + 0.5*10^-d
    s = scale
    scale = d
    r = r*10/10
    scale = s  
    return r
} 

这个解决方案不是那么灵活(它只是将float转换为int),但它可以处理负数:

e=$( echo "scale=0; (${e}+0.5)/1" | bc -l )
if [[ "${e}" -lt 0 ]] ; then
    e=$(( e - 1 ))
fi

您正在添加
0.0005
,因此
bc
很乐意在小数点后加上4位数字。那么我该怎么办呢?所以您有一个。我希望您阅读我在之前的评论中添加的链接。你应该明确地编辑你的问题并指定:1。清楚地说明你想要达到的目标:我想计算一个3位小数的平均值,四舍五入到最接近的值。2.陈述你尝试了什么,并说出为什么它不起作用。这里有大量关于你问题的答案:谢谢!它起作用了。但看起来我必须要做很多工作来编写这样的代码,我在C++上工作,而且很简单,因为语法并不重要,因为我理解语法(空间等)在Basyeh中非常重要,BASH的语法完全是疯狂的。祝你好运
e=$( echo "scale=0; (${e}+0.5)/1" | bc -l )
if [[ "${e}" -lt 0 ]] ; then
    e=$(( e - 1 ))
fi