Sim, como dash, o bash é limitado a matemática aritmética inteira em $((…))
.
De fato, por padrão, todas as shells (padrão POSIX) imprimirão 37 com isto:
$ echo "$((1000/27))"
37
De [POSIX] [1]:
Only signed long integer arithmetic is required.
Você precisa alterar os números um pouco para obter a matemática de ponto flutuante em ksh, zsh e yash (não em jsh, dash, ash, lksh, mksh e bash):
$ echo $((1000/27.0))
37.037037037037037
Mas tenha cuidado com a precedência e precisão do zsh:
$ for sh in ksh yash zsh; do $sh -c 'printf "%20d\n" "$(( 1<<63 - 5))"'; done
288230376151711744
288230376151711744
9223372036854775803
$ for sh in ksh yash zsh; do $sh -c 'printf "%-20s\n" "$((1/10.0))"'; done
0.1
0.1
0.10000000000000001
Limites de truncamento do zsh inesperados:
$ zsh -c 'echo $((12345678901234567890));echo $((12345678901234567890123))'
zsh:1: number truncated after 19 digits: 12345678901234567890
1234567890123456789
zsh:1: number truncated after 22 digits: 12345678901234567890123
-1363962815083169260
Existe uma solução alternativa no bash usando recursos printf (limitado a ~ 10 dígitos):
$ bash -c 'printf "%.10f\n" "$(( 10**10* 1000/27 ))e-10"'
37.0370370370
Mas por que se preocupar em ter bc
disponível:
$ echo '1000/27' | bc -l
37.03703703703703703703
[1]: Apenas aritmética de inteiros longos assinados é necessária.