¿Cómo consigo que bc comience las fracciones decimales con un cero a la izquierda?

¿Cómo consigo que bc comience las fracciones decimales con un cero a la izquierda?

¿Cómo puedo bcempezar con fracciones decimales con un cero a la izquierda?

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

Quiero 0,3333.

Respuesta1

bcDe forma nativa no admite agregar cero.

La solución alternativa es:

echo 'scale=4; 1/3' | bc -l | awk '{printf "%.4f\n", $0}'
0.3333
  • \n  – terminar la salida con una nueva línea.

  • %f  - punto flotante

  • %.4f– el número de dígitos a mostrar. Esto especifica 4 dígitos después del punto decimal.

Respuesta2

Lamentablemente bcestá escrito de tal manera que no se puede. Esta afirmación también se aplica a su vecino dc. Las personas, como solución, generalmente sugieren usar alguna herramienta de procesamiento de texto para cambiar bcla salida, o usar una herramienta completamente diferente como perlo pythonque tenga una sintaxis diferente, pero a mí me parecen demasiado pesadas para una tarea tan simple.

Según sus otras preguntas, parece que es zshusuario, por lo que le sugeriría zcalcque tenga una sintaxis muy similar para operaciones básicas como bc:

$ zcalc -e '1/3'
0.333333

Primero necesita cargar esta función (por ejemplo, dentro .zshrc) y probablemente desee tratar siempre todos los números como un punto flotante con -fla opción:

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

Como beneficio adicional, puede definir un mensaje especial para la calculadora con ZCALCPROMPTun parámetro; para obtener más detalles, consulte man zshcontrib.

Respuesta3

bcSe puede persuadir a que utilice un cero a la izquierda:

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

Respuesta4

Esta es una solución de cinturón y tirantes que soluciona las fallas usando mi respuesta anterior. Esta pequeña función determina de forma algo inteligente cuándo y dónde colocar el 0 inicial y el signo negativo y utiliza el backspacecódigo de control para retroceder en el valor impreso. No funcionará en -s|--standardmodo Posix (¡o si se imprime en un 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 cuando se llama muestra:

$ 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)

información relacionada