Como faço bc
para iniciar frações decimais com zero à esquerda?
$ bc <<< 'scale=4; 1/3'
.3333
Eu quero 0,3333.
Responder1
bc
nativamente não suporta adição de zero.
A solução alternativa é:
echo 'scale=4; 1/3' | bc -l | awk '{printf "%.4f\n", $0}'
0.3333
\n
– finalize a saída com uma nova linha.%f
- ponto flutuante%.4f
– o número de dígitos a mostrar. Isso especifica 4 dígitos após o ponto decimal.
Responder2
Infelizmente bc
está escrito de uma forma que você não consegue. Esta afirmação também se aplica ao seu vizinho dc
. As pessoas, como solução, geralmente sugerem usar alguma ferramenta de processamento de texto para alterar bc
a saída, ou usar ferramentas completamente diferentes, como perl
ou python
que tenham sintaxe diferente, mas para mim elas parecem pesadas demais para uma tarefa tão simples.
Pelas suas outras perguntas, parece que você é zsh
um usuário, então eu sugeriria zcalc
, que tem uma sintaxe muito semelhante para operações básicas como bc
:
$ zcalc -e '1/3'
0.333333
Primeiro você precisa carregar esta função (por exemplo, dentro de .zshrc
) e provavelmente você pode querer sempre tratar todos os números como um ponto flutuante com -f
a opção:
autoload -U zcalc
alias zcalc='zcalc -f'
Como bônus, você pode definir um prompt especial para a calculadora com ZCALCPROMPT
parâmetro, para obter detalhes, consulte man zshcontrib
.
Responder3
bc
pode ser persuadido a usar um zero à esquerda:
for div in 10 1000; do
echo "scale=3;v=158/$div; if(v > -1 && v < 1) print 0,v,\"\n\" else print v, \"\n\"" | bc
done
Responder4
Esta é uma solução de cinto e suspensórios que resolve as falhas usando minha resposta anterior. Esta pequena função descobre de forma inteligente quando e onde colocar o 0 inicial e o sinal negativo e usa o backspace
código de controle para retroceder no valor impresso. Não funcionará no -s|--standard
modo Posix (ou se for impresso em um teletipo!):
#!/usr/bin/env bc
# this is lz.bc
define lz(d) {
if (ibase != 10 || obase != 10) {
print "(io)base must be decimal (10)\n"
return -1
}
n=0; b=0; a=0
if (d<0) n=1 # negative
if (d>-1 && d<0) b=1 # below
if (d>0 && d<1) a=1 # above
print " ", d
for (i=length(d)+1; i>=0; i--) {
print "\b"
if(i==0 && (b || a)) print "0\b\b"
}
if(n) print "-"
print "\n"
return 0
}
v[0]=-.234
v[1]=.234
v[2]=-2.345
v[3]=2.345
v[4]=-123.4567
v[5]=123.456
for(x=0;x<6;x++) {
print v[x], " ... "
r=lz(v[x])
}
obase=16
r=lz(v[5])
quit
que quando chamado exibe:
$ bc lz.bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
-.234 ... -0.234
.234 ... 0.234
-2.345 ... -2.345
2.345 ... 2.345
-123.4567 ... -123.4567
123.456 ... 123.456
(io)base must be decimal (10)