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


当前回答

使用bashj,一个支持Java的Bash变种,你只需要写(而且很容易读):

#!/usr/bin/bashj

#!java
static int doubleCompare(double a,double b) {return((a>b) ? 1 : (a<b) ? -1 : 0);}

#!bashj
num1=3.17648e-22
num2=1.5
comp=j.doubleCompare($num1,$num2)
if [ $comp == 0 ] ; then echo "Equal" ; fi
if [ $comp == 1 ] ; then echo "$num1 > $num2" ; fi
if [ $comp == -1 ] ; then echo "$num2 > $num1" ; fi

当然,bashj Bash/Java混合提供了更多…

其他回答

这个脚本可以帮助我检查安装的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

一个纯Bash解决方案,用于比较没有指数符号,前导或尾随零的浮点数:

if [ ${FOO%.*} -eq ${BAR%.*} ] && [ ${FOO#*.} \> ${BAR#*.} ] || [ ${FOO%.*} -gt ${BAR%.*} ]; then
  echo "${FOO} > ${BAR}";
else
  echo "${FOO} <= ${BAR}";
fi

逻辑运算符的顺序很重要。整数部分作为数字进行比较,小数部分故意作为字符串进行比较。使用这种方法将变量分成整数部分和小数部分。

它不会比较浮点数和整数(不带点)。

一行程序解决方案

假设有两个变量A和B,

echo "($A > $B) * $B + ($A < $B) * $A" | bc

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

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

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

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