¿Cómo puedo bc
empezar con fracciones decimales con un cero a la izquierda?
$ bc <<< 'scale=4; 1/3'
.3333
Quiero 0,3333.
Respuesta1
bc
De 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 bc
está 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 bc
la salida, o usar una herramienta completamente diferente como perl
o python
que tenga una sintaxis diferente, pero a mí me parecen demasiado pesadas para una tarea tan simple.
Según sus otras preguntas, parece que es zsh
usuario, por lo que le sugeriría zcalc
que 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 -f
la opción:
autoload -U zcalc
alias zcalc='zcalc -f'
Como beneficio adicional, puede definir un mensaje especial para la calculadora con ZCALCPROMPT
un parámetro; para obtener más detalles, consulte man zshcontrib
.
Respuesta3
bc
Se 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 backspace
código de control para retroceder en el valor impreso. No funcionará en -s|--standard
modo 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)