awk浮点数比较异常求助:-20.1被误判为≤-22.0
问题原因
你遇到的问题是字符串与数值的比较逻辑导致的错误判断。
具体来说:
- 通过
substr($2, 1, length($2)-1)提取的mse_db是字符串类型(值为"-20.100000000000001") - awk在比较字符串和数值时,若未明确转换类型,会触发逐字符的字符串比较逻辑:
字符串"-20.100000000000001"与"-22.0"逐字符对比时,第三个字符'0'的ASCII码(48)小于'2'(50),因此被判定为"-20.1..." < "-22.0",最终触发了mse_db <= -22.0的分支。
解决方法
将提取到的字符串强制转换为数值类型,只需在赋值时添加+ 0即可:
echo '"MSE_DB": -20.100000000000001,' | awk '/MSE_DB/ {mse_db = substr($2, 1, length($2)-1) + 0} END {printf("MSE_DB %f ", mse_db); if (mse_db > -22.0) {print ">-22.0"}; if (mse_db <= -22.0) {print "<= -22.0"} }'
这样mse_db会被明确转为数值,后续比较基于数值大小逻辑,输出会符合预期:
MSE_DB -20.100000 >-22.0
额外优化建议
- 可以用更简洁的方式去除末尾逗号:用
sub(/,$/, "", $2)替换手动截取,避免计算长度的麻烦:
echo '"MSE_DB": -20.100000000000001,' | awk '/MSE_DB/ {sub(/,$/, "", $2); mse_db = $2 + 0} END {printf("MSE_DB %f ", mse_db); if (mse_db > -22.0) {print ">-22.0"} else {print "<= -22.0"} }'
- 用
else替代两个独立if,减少冗余判断。
内容的提问来源于stack exchange,提问作者flyck
相关产品推荐
相关产品推荐

