Bash中数组浮点数比较结果异常的技术咨询
解决Bash中浮点数比较的错误问题
我来帮你搞定这个浮点数比较的坑!你的核心问题出在**[[ ]]对bc输出的判断逻辑**上,咱们一步步拆解清楚:
问题根源
当你执行echo "${sorted[-2]} > 0.8" | bc时,bc会返回0(毕竟0.0223611确实小于0.8),但[[ $(...) ]]的判断规则是:只要命令输出的字符串非空,就会被视为“真”——哪怕这个字符串是0!所以哪怕bc返回了代表“假”的0,[[ "0" ]]仍然会触发then分支,输出错误的yes。
正确的解决方案
你需要把bc的输出当作数值来判断,而不是单纯检查字符串是否非空,这里有两种常用且可靠的方法:
方法1:用(( ))算术判断
(( ))会把括号内的内容当作算术表达式,0代表假,非0代表真,完美匹配bc的输出规则:
sorted=(0 0.0223611 0.977639) if (( $(echo "${sorted[-2]} > 0.8" | bc) )); then echo 'yes' else echo 'no' fi
执行这段代码会正确输出no,因为bc返回的0在(( ))中被判定为假。
方法2:直接比较bc输出是否等于1
用-eq做数值比较,明确判断bc的输出是否为代表“真”的1,逻辑更直观:
sorted=(0 0.0223611 0.977639) if [[ $(echo "${sorted[-2]} > 0.8" | bc) -eq 1 ]]; then echo 'yes' else echo 'no' fi
这种方式也能得到正确的no结果。
验证正确场景
比如你最初和0比较的场景,用这两种方法也能正常输出yes:
# 方法1验证 if (( $(echo "${sorted[-2]} > 0" | bc) )); then echo 'yes'; else echo 'no'; fi # 输出 yes # 方法2验证 if [[ $(echo "${sorted[-2]} > 0" | bc) -eq 1 ]]; then echo 'yes'; else echo 'no'; fi # 输出 yes
内容的提问来源于stack exchange,提问作者carolynzy
相关产品推荐
相关产品推荐

