浮点比较忽略小数点

时间:2013-11-10 17:33:02

标签: bash

您好我有以下代码:

#!/bin/bash
atmo =`echo "-5000*l(10^-6)" | bc -l`
echo "Threshold: $atmo m"
for altitude in {70000..0..10}
do
  if [[ $altitude < $atmo ]]; then
    printf "A %.1f m\n" "$altitude"
  else
    printf "B %.1f m\n" "$altitude"
  fi
done

因此,如果altitude为高(约69077),则应该进入else分支。现在这实际上有效,直到altitude失去一个有效数字(例如从10000切换到9990)。然后它开始转到else分支,直到altitude低于atmo的十分之一。当高度从1000切换到990时,再次发生这种情况。再次进入其他分支,直到高度低于atmo的百分之一,依此类推。

所以基本上是这样的:

  • 70000至69080:else branch(correct)
  • 69000到10000:if branch(correct)
  • 9990至6910:else分支(不正确
  • 6900到1000:if branch(correct)
  • 990 to 700:else分支(不正确
  • 690到100:if branch(correct)
  • 90到70:else分支(不正确
  • 60到0:if branch(correct)

现在问题是如何解决这种奇怪的行为?

1 个答案:

答案 0 :(得分:3)

问题是[[ $altitude < $atmo ]]进行字符串比较。 $atmo是69077,它在700之前和之后的100000之间,因此给你带来奇怪的结果。

Bash不支持小数,因此您也可以使用bc进行比较:

if (( $(bc -l <<< "$altitude < $atmo") ))
then
  printf "A"
else
  printf "B"
fi
printf " %.1f m\n" "$altitude"