假设我有一个变量,我想在乘以 1000 后打印 5 个有效数字。zsh
可以做到:
zsh$ x=2.8026407e+00
zsh$ printf "%.5g\n" "$(( 1000*${x} ))"
zsh> 2802.6
也能bash
做到吗?
bash$ x=2.8026407e+00
bash$ printf "%.5g\n" "$(( 1000*${x} ))"
bash> bash: 1000*2.8026407e+00 : syntax error: invalid arithmetic operator (error token is ".8026407e+00 ")
我认为没有办法让原生 bash 理解浮点运算,是吗?我知道我可以使用 eg awk
,但我想知道是否bash
可以这样做。
(我对bash
不能处理浮点数并不感到惊讶,但zsh
可以!)
bash
不做浮点运算,而是定点,其中小数固定在零位(即整数数学)。这意味着您可以解决它进行一些非常非常基本的计算:因此,1/3 到三个位置是 0.333。
这是一个坏主意; 不要这样做。
有很多方法可以在命令行上进行 FP 数学运算。这里仅举两个例子:
bash
不能做小数点数学运算,只能做整数运算是的,就像破折号一样,bash 仅限于
$((…))
.事实上,默认情况下,所有 shell(默认 POSIX)都会打印 37 :
来自 [POSIX][1]:
您需要稍微更改数字以在 ksh、zsh 和 yash(不是 jsh、dash、ash、lksh、mksh 和 bash)中获得浮点数学:
但要注意 zsh 的优先级和精度:
意外的 zsh 截断限制:
在 bash 中有一个使用 printf 功能的解决方法(限制为 ~10 位):
但是为什么要麻烦有
bc
可用的:[1]:只需要有符号长整数运算。
没有专门使用 bash,但您应该可以
bc
使用: