bc: establece el número de dígitos después del punto decimal


52

bc maneja los números como enteros:

# echo "100/3" | bc
33

bc -l maneja los números como objetos de coma flotante:

# echo "100/3" | bc -l
33.33333333333333333333

¿Hay alguna manera de limitar el número de dígitos después del punto decimal?


10
Curiosamente, esto solo funciona con la división. Si quieres hacerlo scale=0;1234*1.1, tienes que escribirlo scale=0;1234*1.1/1para obtenerlo 1357. De lo contrario, no importa el valor de scale, obtienes 1357.4.
Wok

¿No debería el comentario de @Wok estar en la respuesta aceptada, en lugar de en la pregunta? Hasta que leí la respuesta, no tenía idea de a qué se refería este comentario.
Wilson F

1
@WilsonF Se agregó una referencia a la respuesta.
Adam Matan

2
@Wok, no depende de la división o multiplicación. Depende de la entrada: el número de precisión más grande determina la precisión en la salida. Tenga en cuenta cómo 1234*1.0le dará1234.0
Richlv

Respuestas:


71

Establezca la scalevariable especial:

$ echo "scale=2; 100/3" | bc
33.33

3
Vea el comentario de @ Wok ​​sobre la pregunta.
Adam Matan

$ echo "scale=2; (100/180)*180" | bcda 99.00 :(
Donatas Olsevičius

@ DonatasOlsevičius esto se debe a que (100/180) = 0.55 y luego (0.55 * 180) = 99. Entonces le está dando el valor correcto :)
Kamaldeep singh Bhatia

Sería bueno si se redondeara arriba .5. ~$ echo "scale=2; 12/104" | bc .11 Si redondeado esto sería .12. Sin embargo, aún debería hacer el trabajo para mi tarea.
jbrock

3
Se puede mantener la precisión de impresión hasta el valor de esta manera: echo "result = (100/180) * 180; scale=2; result / 1" | bc -l. Ahora lo tienes 99.99.
Byron Hawkins el

11

scaletrabaja solo para la división; Si algunos geeks lo necesitan en la multiplicación, entonces puedes lograrlo usando la manipulación de cuerdas. Diga si necesita multiplicar 32 * 0.60, la respuesta es 19.20. Si necesita obtener solo 19 en respuesta, puede obtenerlo por diferentes métodos.

  1. Usando la manipulación de cadenas

    $ S=$(echo "32*.60" | bc ) ; echo ${S%.*}
    19
    

    Sintaxis de manipulación de cadenas: ${Variable%pattern}esto eliminará el patrón de coincidencia corto que viene después %. Para obtener más detalles sobre la manipulación de cadenas, consulte la Guía avanzada de secuencias de comandos Bash .

  2. Utilizando Scalesegún lo indicado por**chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. Para deshacerse de los ceros finales, en lugar de la manipulación de cadenas, también se puede dividir por 1.

    $ echo "0.232 * 1000" | bc
    232.000
    
    $ echo "0.232 * 1000 / 1" | bc
    232
    

Tenga en cuenta que, como mencioné en mi comentario sobre la pregunta, no es causada por la multiplicación, sino por los números de entrada que tienen una parte decimal. O, para decirlo de otra manera, el número con la parte decimal "más larga" determinará cuántos lugares decimales tendrá la salida.
Richlv

4

Además de respuestas anteriores

echo "scale=2; 1.0150876" | bc

Devoluciones

1.0150876

Agregue operaciones matemáticas para obtener solo 2 números decimales - (NÚMERO * 100) / 100

echo "scale=2; (1.0150876 * 100) / 100" | bc

Ahora vuelve

1.01

3

También puede usar el comando printf para redondear el resultado hasta 3 decimales

# printf "%.3f\n" $(echo "100/3" | bc -l)
3.333

2

Redondear

scale = 2 trunca la respuesta a dos dígitos decimales, pero podemos lograr el redondeo así:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.