if else 语句涉及科学记数法中的两个数字

if else 语句涉及科学记数法中的两个数字

我有两个用科学计数法表示的数字,我想在 bash 的 if 语句中对它们进行一些比较。这样做时,我收到类似 bwlow 的错误: 例如:

bash-4.2$ a=10e-12
bash-4.2$ b=12e-12
bash-4.2$ if (( a > b )); then r=1; else r=0; fi
bash: ((: 10e: value too great for base (error token is "10e")

如果 a 和 b 是整数,则不会出现同样的问题。如果我使用上述语句,我会发现浮点数存在问题。有没有一种简单的方法可以在 if 语句中进行比较?

答案1

使用“awk”

正如@Theophrastus 上面所指出的,既不bash也不bc支持科学记数法。

对于简单的比较和计算,我建议使用awk(它确实处理 xEy 数字):

a=10e-12
b=12e-12

r=$(awk 'BEGIN{print ('$a'>'$b')?1:0}')
echo $r

对于更复杂的表达式,您可以通过将变量传递给awkwith 来避免繁琐的引号处理和转义-v,这实际上是首选方法:

r=$(awk -v a="$a" -v b="$b" 'BEGIN{print (a<b)?1:0}')

使用“bc”

有多种方法可以将您的符号重新格式化为替代形式x * 10^y这是可以理解的bc(或者你可以自己做),但是bc当涉及到负指数时有一些特殊性(如你的例子):

$ bc
10^12
1000000000000
10^-12
0

相关内容