我正在努力比较Bash脚本中的两个浮点数。我有两个变量,例如。

let num1=3.17648e-22
let num2=1.5

现在,我想对这两个数字做一个简单的比较:

st=`echo "$num1 < $num2" | bc`
if [ $st -eq 1]; then
  echo -e "$num1 < $num2"
else
  echo -e "$num1 >= $num2"
fi

不幸的是,我有一些问题与num1的正确处理可以是“电子格式”。


当前回答

Bash只处理整数数学,但是你可以像下面这样使用bc命令:

$ num1=3.17648E-22
$ num2=1.5
$ echo $num1'>'$num2 | bc -l
0
$ echo $num2'>'$num1 | bc -l
1

注意,指数符号必须是大写的。

其他回答

支持所有可能的表示法的解决方案,包括大小写指数的科学表示法(例如,12.00e4):

if (( $(bc -l <<< "${value1/e/E} < ${value2/e/E}") ))
then
    echo "$value1 is smaller than $value2"
fi 

你可以使用AWK结合Bash if条件:

if awk "BEGIN {exit !($d1 >= $d2)}"; then
    echo "yes"
else
    echo "no"
fi
num1=0.555
num2=2.555


if [ `echo "$num1>$num2"|bc` -eq 1 ]; then
       echo "$num1 is greater then $num2"
else
       echo "$num2 is greater then $num1"
fi

只需将echo替换为printf(它理解浮点数):

st=$(  printf '%50G < %50G\n' "$num1" "$num2" | bc -l  )

对于非整数数学,最好使用AWK。你可以使用这个Bash实用函数:

numCompare() {
   awk -v n1="$1" -v n2="$2" 'BEGIN {printf "%s " (n1<n2?"<":">=") " %s\n", n1, n2}'
}

称之为:

numCompare 5.65 3.14e-22
5.65 >= 3.14e-22

numCompare 5.65e-23 3.14e-22
5.65e-23 < 3.14e-22

numCompare 3.145678 3.145679
3.145678 < 3.145679