Como faço para que bc inicie frações decimais com zero à esquerda

Como faço para que bc inicie frações decimais com zero à esquerda

Como faço bcpara iniciar frações decimais com zero à esquerda?

$ bc <<< 'scale=4; 1/3'
  .3333

Eu quero 0,3333.

Responder1

bcnativamente 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 bcestá 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 bca saída, ou usar ferramentas completamente diferentes, como perlou pythonque tenham sintaxe diferente, mas para mim elas parecem pesadas demais para uma tarefa tão simples.

Pelas suas outras perguntas, parece que você é zshum 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 -fa opção:

autoload -U zcalc
alias zcalc='zcalc -f'

Como bônus, você pode definir um prompt especial para a calculadora com ZCALCPROMPTparâmetro, para obter detalhes, consulte man zshcontrib.

Responder3

bcpode 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 backspacecódigo de controle para retroceder no valor impresso. Não funcionará no -s|--standardmodo 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)

informação relacionada