【shell】浮点数如何比较

本文介绍了如何在Bash脚本中使用expr命令进行浮点数的比较,包括等于、不等于、大于、小于等操作,并提供了一个函数示例和实际运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bash在线调试工具:Bash 在线工具 | 菜鸟工具

浮点数的比较有点特殊,无法使用字符串和整型的比较方式,需要使用到额外的命令,命令有好几种,我们就选择内置的命令expr,以免去安装

浮点数比较符

比较符含义运算情况
expr  ==等于相等返回 1
expr  !=不等于不相等返回 1
expr  \>大于,要使用转义符\大于返回 1
expr  \>=大于等于,要使用转义符\大于等于返回 1
expr  \<小于,要使用转义符\小于返回 1
expr  \<=小于等于,要使用转义符\小于等于返回 1

正确用法 

#!/bin/bash

function before()
{
    # 功能:浮点数计算前的预处理,请调用示例:before 1.1 2.3 +2312.2 $a $b -30.23
    # $@:待处理的浮点数,空格隔开
    # return:ret_all_para 处理好后的浮点数

    all_para=($@)
    ret_all_para=()
    # 寻找最大的整数位
    max_int_num=0
    for each in ${all_para[@]}
    do
        # 去掉符号
        if [[ ${each:0:1} == '-' ]] || [[ ${each:0:1} == '+' ]];then
            each=${each:1}
        fi
        int_part_num=`echo $each|cut -d '.' -f 1|wc -m`
        if [ $int_part_num -gt $max_int_num ];then
            max_int_num=$int_part_num
        fi
    done
    # 不足位数的前方补零
    i=0
    for each in ${all_para[@]}
    do
        zero_num=""
        # 去掉符号
        if [[ ${each:0:1} == '-' ]] || [[ ${each:0:1} == '+' ]];then
            each_tmp=${each:1}
        else
            each_tmp=${each}
        fi
        int_part_num=`echo $each_tmp|cut -d '.' -f 1|wc -m`
        if [ $int_part_num -lt $max_int_num ];then
            diff=`expr $max_int_num - $int_part_num`
            j=1
            while [ $j -le $diff ]
            do
                zero_num=$zero_num"0"
                let j++
            done
        fi
        # 符号处理
        if [[ ${each:0:1} == '-' ]];then
            each=${each:1}
            symbol='0'
        elif [[ ${each:0:1} == '+' ]];then
            each=${each:1}
            symbol='1'
        else
            symbol='1'
        fi
        ret_all_para[$i]=$symbol$zero_num$each
        let i++
    done
}


a=1.1
b=6.1
c=1.1
d=1.4
e=40.1
f=-543.232

before $a $b $c $d $e $f
a=${ret_all_para[0]}
b=${ret_all_para[1]}
c=${ret_all_para[2]}
d=${ret_all_para[3]}
e=${ret_all_para[4]}
f=${ret_all_para[5]}

# 等于
if [[ `expr $a == $c`  == 1 ]];then
    echo "a == c"
fi
# 不等于
if [[ `expr $a != $b`  == 1 ]];then
    echo "a != b"
fi
# 大于
if [[ `expr $b \> $a`  == 1 ]];then
    echo "b > a"
fi
# 大于等于
if [[ `expr $c \>= $a`  == 1 ]];then
    echo "c >= a"
fi
if [[ `expr $e \>= $b`  == 1 ]];then
    echo "e >= b"
fi
# 小于
if [[ `expr $a \< $b`  == 1 ]];then
    echo "a < b"
fi
# 小于等于
if [[ `expr $c \<= $a`  == 1 ]];then
    echo "c <= a"
fi
if [[ `expr $b \<= $e`  == 1 ]];then
    echo "b <= e"
fi
# 负数的比较
if [[ `expr $f \<= $a`  == 1 ]];then
    echo "f <= a"
fi

运行结果

a == c
a != b
b > a
c >= a
e >= b
a < b
c <= a
b <= e
f <= a

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值