How to compare two floating point numbers in Bash?

前端 未结 17 2154
無奈伤痛
無奈伤痛 2020-11-22 02:17

I am trying hard to compare two floating point numbers within a bash script. I have to variables, e.g.

let num1=3.17648e-22
let num2=1.5

No

相关标签:
17条回答
  • 2020-11-22 02:36

    awk and tools like it (I'm staring at you sed...) should be relegated to the dustbin of old projects, with code that everyone is too afraid to touch since it was written in a read-never language.

    Or you're the relatively rare project that needs to prioritize CPU usage optimization over code maintenance optimization... in which case, carry on.

    If not, though, why not instead just use something readable and explicit, such as python? Your fellow coders and future self will thank you. You can use python inline with bash just like all the others.

    num1=3.17648E-22
    num2=1.5
    if python -c "exit(0 if $num1 < $num2 else 1)"; then
        echo "yes, $num1 < $num2"
    else
        echo "no, $num1 >= $num2"
    fi
    
    0 讨论(0)
  • 2020-11-22 02:37

    Pure bash solution for comparing floats without exponential notation, leading or trailing zeros:

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

    Order of logical operators matters. Integer parts are compared as numbers and fractional parts are intentionally compared as strings. Variables are split into integer and fractional parts using this method.

    Won't compare floats with integers (without dot).

    0 讨论(0)
  • 2020-11-22 02:37
    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
    
    0 讨论(0)
  • 2020-11-22 02:39

    A solution supporting all possible notations, including the scientific notation with both uppercase and lowercase exponents (e.g., 12.00e4):

    if (( $(bc -l <<< "${value1/e/E} < ${value2/e/E}") ))
    then
        echo "$value1 is below $value2"
    fi 
    
    0 讨论(0)
  • 2020-11-22 02:40

    bash handles only integer maths but you can use bc command as follows:

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

    Note that exponent sign must be uppercase

    0 讨论(0)
  • 2020-11-22 02:45

    You can use awk combined with a bash if condition:

    if awk 'BEGIN {exit !('$d1' >= '$d2')}'; then
        echo "yes"
    else 
        echo "no"
    fi
    
    0 讨论(0)
提交回复
热议问题