Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
在bash中四舍五入到最接近的0.5位小数_Bash - Fatal编程技术网

在bash中四舍五入到最接近的0.5位小数

在bash中四舍五入到最接近的0.5位小数,bash,Bash,我想在bash中将变量四舍五入到最接近的0.5位小数 例如,1.3应该是1.5,1.15应该是1,2.8应该是3,等等。可能有一种更简单的方法来做到这一点,但这应该是可行的: echo "1.3 * 2" | bc | xargs -I{ printf "%1.f" { | xargs -I% echo "% * .5" | bc #1.5 echo "1.15 * 2" | bc | xargs -I{ printf "%1.f" { | xargs -I% echo "% * .5" |

我想在bash中将变量四舍五入到最接近的0.5位小数


例如,1.3应该是1.5,1.15应该是1,2.8应该是3,等等。

可能有一种更简单的方法来做到这一点,但这应该是可行的:

echo "1.3 * 2" | bc | xargs -I{ printf "%1.f" { | xargs -I% echo "% * .5" | bc
#1.5

echo "1.15 * 2" | bc | xargs -I{ printf "%1.f" { | xargs -I% echo "% * .5" | bc
#1.0

echo "2.8 * 2" | bc | xargs -I{ printf "%1.f" { | xargs -I% echo "% * .5" | bc
#3.0
所以这里唯一要改变的是回声值的第一个数字。如果你想要一个函数

function roundhalves { echo "$1 * 2" | bc | xargs -I@ printf "%1.f" @ | xargs -I% echo "% * .5" | bc }
就这样说吧:

roundhalves 1.3
roundhalves 1.15
roundhalves 2.8

可能有一种更简单的方法可以做到这一点,但这应该是可行的:

echo "1.3 * 2" | bc | xargs -I{ printf "%1.f" { | xargs -I% echo "% * .5" | bc
#1.5

echo "1.15 * 2" | bc | xargs -I{ printf "%1.f" { | xargs -I% echo "% * .5" | bc
#1.0

echo "2.8 * 2" | bc | xargs -I{ printf "%1.f" { | xargs -I% echo "% * .5" | bc
#3.0
所以这里唯一要改变的是回声值的第一个数字。如果你想要一个函数

function roundhalves { echo "$1 * 2" | bc | xargs -I@ printf "%1.f" @ | xargs -I% echo "% * .5" | bc }
就这样说吧:

roundhalves 1.3
roundhalves 1.15
roundhalves 2.8
仅限Bash(无需调用
bc
或其他外部计算器),支持各种带或不带符号的十进制数,带或不带整数部分,带或不带小数部分:

function roundhalves () {
    [[ $1 =~ ^([\+-]?)([0-9]*)\.([0-9]+)$ ]] || { printf "%s\n" "$1" && return; }
    s=${BASH_REMATCH[1]}
    a=${BASH_REMATCH[2]}
    (( b = 1${BASH_REMATCH[3]} * 2 ))
    [[ $b =~ ^([0-9][0-9])[0-9]*$ ]] && b=${BASH_REMATCH[1]}
    (( b < 25 ? (b = 0) : b >= 35 ? (a += 1, b = 0) : (b = 5) ))
    printf "%s%s.%d\n" "$s" "$a" "$b"
}
函数roundhalves(){
[[$1=~^([\+-]?)([0-9]*)\.([0-9]+$]].{printf”%s\n“$1”和&return;}
s=${BASH_重赛[1]}
a=${BASH_重赛[2]}
((b=1${BASH_重赛[3]}*2))
[b=~^([0-9][0-9])[0-9]*$]&&b=${BASH_重赛[1]}
((b<25?(b=0):b>=35?(a+=1,b=0):(b=5)))
printf“%s%s.%d\n“$s”$a“$b”
}
注意:算法很简单:取小数部分,加上1,乘以2,保留两个前导(最左边)数字。结果整数在
[20..39]
范围内。与25和35相比

注意:舍入是朝向无穷大的,但这很容易修改

注:这受到最大可表示数字的限制(
[-2**63..2**63-1]
在64位体系结构上)。
bc
没有这种限制。如果您的数字可能有很多(超过18个)整数或小数部分的数字,并且如果您有,请只选择
bc

Bash(无需调用
bc
或其他外部计算器),并支持各种带或不带符号的十进制数字,带或不带整数部分以及带或不带小数部分:

function roundhalves () {
    [[ $1 =~ ^([\+-]?)([0-9]*)\.([0-9]+)$ ]] || { printf "%s\n" "$1" && return; }
    s=${BASH_REMATCH[1]}
    a=${BASH_REMATCH[2]}
    (( b = 1${BASH_REMATCH[3]} * 2 ))
    [[ $b =~ ^([0-9][0-9])[0-9]*$ ]] && b=${BASH_REMATCH[1]}
    (( b < 25 ? (b = 0) : b >= 35 ? (a += 1, b = 0) : (b = 5) ))
    printf "%s%s.%d\n" "$s" "$a" "$b"
}
函数roundhalves(){
[[$1=~^([\+-]?)([0-9]*)\.([0-9]+$]].{printf”%s\n“$1”和&return;}
s=${BASH_重赛[1]}
a=${BASH_重赛[2]}
((b=1${BASH_重赛[3]}*2))
[b=~^([0-9][0-9])[0-9]*$]&&b=${BASH_重赛[1]}
((b<25?(b=0):b>=35?(a+=1,b=0):(b=5)))
printf“%s%s.%d\n“$s”$a“$b”
}
注意:算法很简单:取小数部分,加上1,乘以2,保留两个前导(最左边)数字。结果整数在
[20..39]
范围内。与25和35相比

注意:舍入是朝向无穷大的,但这很容易修改


注:这受到最大可表示数字的限制(
[-2**63..2**63-1]
在64位体系结构上)。
bc
没有这种限制。如果您的数字可能有很多(超过18个)整数或小数部分的数字,如果您有,请选择
bc

,这是一个非原创的答案,是根据@CharlesDuffy对已接受的答案留下的非常有用的评论而形成的。唯一的区别是我删除了here字符串,这样我就可以在sh和bash上使用这个函数

roundhalves() {
    printf '%s * 0.5\n' "$(printf '%1.f' "$(printf '%s * 2\n' "$1" | bc)")" | bc
}

我只是觉得它可能对任何试图编写可移植脚本的人都有用。

这是一个非原创的答案,它是根据@CharlesDuffy对公认答案的一条非常有用的评论得出的。唯一的区别是我删除了here字符串,这样我就可以在sh和bash上使用这个函数

roundhalves() {
    printf '%s * 0.5\n' "$(printf '%1.f' "$(printf '%s * 2\n' "$1" | bc)")" | bc
}
我只是觉得它可能对任何试图编写可移植脚本的人都有用。

那么:

awk '{print int(($1+0.25)/0.5)*0.5}'. 
另外,如果你想将一个数字四舍五入到最接近的x(如0.1、50、100等),只需使用

awk '{print int(($1+x/2)/x)*x}'. 
那么:

awk '{print int(($1+0.25)/0.5)*0.5}'. 
另外,如果你想将一个数字四舍五入到最接近的x(如0.1、50、100等),只需使用

awk '{print int(($1+x/2)/x)*x}'. 

不幸的是,该示例没有四舍五入到0.5的最接近倍数…您可能应该显示到目前为止您尝试了什么以获得帮助不幸的是,该示例没有四舍五入到0.5的最接近倍数…您可能应该显示到目前为止您尝试了什么以获得帮助这非常有效!非常感谢您抽出时间回答我的问题。真的很感激!为什么要和xargs乱搞
roundhalves(){local val;val=$(bc没问题。@CharlesDuffy nice one!…或者更清楚一些(虽然在运行时效率稍低):
roundhalves(){bc如果您愿意,请随意编辑以采纳我的任何建议。这非常有效!非常感谢您抽出时间回答我的问题。非常感谢!为什么要用xargs来捣乱?
roundhalves(){local val;val=$(bc No problemo.@CharlesDuffy nice one!…或者更清楚一些(虽然在运行时效率有点低):
roundhalves(){bc如果您愿意,请随意编辑以采纳我的任何建议。谢谢,雷诺。非常感谢!谢谢,雷诺。非常感谢!