Cuaderno de Campo

Nota: Observa que después de este apunte escribí otro sobre operaciones con decimales en Bash utilizando otro método mucho más "elegante". Puedes leerlo aquí.

Necesitaba realizar unas comparaciones de números con decimales, positivos y negativos para unos pequeños scripts que informan sobre el estado del clima (posa el ratón un segundo sobre la imagen de "cielo sobre Cartagena" para leerlo. En la columna de la derecha).



Problema


Si en un script hacemosecho "scale=2; 12.5 - 12.2 | bc -l" nos dará como resultado .3 (sin cero delante).
Para producir un número "entero" (con el cero delante), podemos hacer lo siguientea=12.5; b=12.2;\
echo "scale=6; resta = $a -$b; if (resta < 1 && 0 <= resta ) { print "0" }; print resta" |\
bc -l

Que imprimiría 0.3, PERO si la resta es negativa nos mostrará 0-.3 (cero menos coma tres)

Además ninguna de las formas anteriores es admitida por IF que solo compara números enteros:a=0.3; if [ $a -gt 0.1 ]; then echo "A es mayor que B"; else echo "A es menor que B"; fi
DICE que -->bash: [: 0.3: se esperaba una expresión entera

Solución


Al final una solución de casa de mi abuela: multiplicar todo por 1000 (o cualquier otro factor suficientemente grande como para convertir tus operaciones en números enteros) y a tomar viento. Algo así:#hacemos la operacion que nos producía un decimal negativo
resta=`factor=1000; a=12.2; b=12.5; \
echo "( $a*$factor ) - ( $b*$factor )" | bc`
#$resta es -300.0
#quitamos los decimales
resta=`${resta/.*/}
#$resta es -300
#hacemos comparacion
comparador=`factor=1000; \
echo "$factor * 0.1" | bc`
#$comparador=100.0
#quitamos los decimales
comparador=${comparador/.*/}
#hacemos la comparacion
if [ $resta -gt $comparador ]; then echo "A es mayor que B"; else echo "A es menor que B"; fi
A es menor que B

  1. ezitoc, 7 de diciembre, 2010Muchas gracias, me fue de gran ayuda.
El formulario para dejar en este apunte ya fué cerrado. Se cierran automáticamente después de dos años de la publicación.
Gracias por tu interés.

© Cuaderno de campo es un blog personal mantenido y desarrollado por Trebol-a y en el que participan Trebol-a, Miguel, Mónica y Merche.

Todo el material de textos, fotografías y vídeos aquí publicado (y salvo que se exprese lo contrario) se hace bajo licencia Creative Commons, para cualquier duda o aclaración puedes dirigirte a Trebol-a por correo electrónico.