Bash中数值为10.00时小于比较操作异常问题求助
Bash浮点数比较异常问题解决
问题现象
运行以下脚本时,明明PYLINT_SCORE=10.00大于THRESHOLD=7,却输出了你的代码未达到阈值要求:
PYLINT_SCORE=10.00 THRESHOLD=7 if [[ $PYLINT_SCORE < $THRESHOLD ]]; then echo "你的代码未达到阈值要求"; else echo "你的代码符合阈值要求"; fi;
但将PYLINT_SCORE改为9.99时,输出结果正常(显示你的代码符合阈值要求):
PYLINT_SCORE=9.99 THRESHOLD=7 if [[ $PYLINT_SCORE < $THRESHOLD ]]; then echo "你的代码未达到阈值要求"; else echo "你的代码符合阈值要求"; fi;
问题原因
bash的[[ ... ]]结构中,<是字符串字典序比较,而非数值比较:
- 对比
10.00和7时,会从第一个字符开始比较:1的ASCII码小于7,因此bash判定10.00 < 7为真,进入if分支。 - 对比
9.99和7时,第一个字符9的ASCII码大于7,判定为假,进入else分支,结果正确。
解决方案
bash本身不支持直接的浮点数数值比较,需借助bc工具处理,或转换为整数比较:
方案1:使用bc进行浮点数比较
PYLINT_SCORE=10.00 THRESHOLD=7 # bc返回1表示真,0表示假,(( ... ))将返回值作为数值判断 if (( $(echo "$PYLINT_SCORE < $THRESHOLD" | bc -l) )); then echo "你的代码未达到阈值要求"; else echo "你的代码符合阈值要求"; fi;
方案2:转换为整数比较(适用于固定小数位数的情况)
如果分数都是两位小数,可以将数值乘以100转为整数,再用bash原生的整数比较:
PYLINT_SCORE=10.00 THRESHOLD=7 # 转换为整数 SCORE_INT=$(echo "$PYLINT_SCORE * 100" | bc | cut -d. -f1) THRESHOLD_INT=$((THRESHOLD * 100)) if (( SCORE_INT < THRESHOLD_INT )); then echo "你的代码未达到阈值要求"; else echo "你的代码符合阈值要求"; fi;
内容的提问来源于stack exchange,提问作者Anoop
相关产品推荐
相关产品推荐

