我正在努力比较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的正确处理可以是“电子格式”。


当前回答

请检查以下编辑代码:

#!/bin/bash

export num1=(3.17648*e-22)
export num2=1.5

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

这很有效。

其他回答

这个脚本可以帮助我检查安装的Grails版本是否大于最低要求。

#!/bin/bash

min=1.4
current=`echo $(grails --version | head -n 2 | awk '{print $NF}' | cut -c 1-3)`

if [ 1 -eq `echo "${current} < ${min}" | bc` ]
then
    echo "Yo, you have an older version of Grails."
else
    echo "Hurray, you have the latest version"
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

对于非整数数学,最好使用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

以下是基于gawk+GMP的方法,用于考虑更广泛的潜在输入:

 echo " 5.65e-23 3.14e-22\n
        5.65 3.14e-2203\n
        3.145678 3.145679\n
        3.25353E+9293 325353e9288\n
        3.14159e+200000000001 3.1415899999999999999999E200000000001\n
        100000 100000.0\n
             4096 4096" \
                         \
 | gawk -v PREC=9999999 -nMbe '
  
   NF+=OFS=sprintf(" %s ",
          (+($!_=sprintf("%24s",$!_)<+$NF) \
     ? "<" \
        : (+$NF<+$!_) \
     ? ">" \
        : (int(+$!_)==(__=int(+$NF)))*\
          (__==+$NF)*index($!_,$NF  )  \
     ? "=" \
         : "\342\211\210")' | ecp 
 
                5.65e-23 < 3.14e-22
                    5.65 > 3.14e-2203
                3.145678 < 3.145679
           3.25353E+9293 ≈ 325353e9288
   3.14159e+200000000001 ≈ 3.1415899999999999999999E200000000001
                  100000 ≈ 100000.0
                    4096 = 4096
 

对于更明确的情况,它会给你一个明确的答案

小于<, 大于>,或者 完全等于=(目前是纯整数情况)

当它相对不明确时,它输出Unicode字符U+2248≈ALMOST EQUAL TO,而不是试图不惜一切代价解析它。

大多数情况下你不需要1000万的PREC;像PREC = 32767这样的值对于一个人在典型基础上遇到的大多数情况已经足够好了。

当然,如果你不需要真正的浮点运算,只需要对例如美元值进行运算,其中总是有两个十进制数字,你可能只需要去掉点(有效地乘以100)并比较得到的整数。

if [[ $((10#${num1/.})) < $((10#${num2/.})) ]]; then
    ...

这显然需要确保两个值的小数点后数位相同。