¿Cómo redondeo correctamente los números de coma flotante IEEE 754 en la línea de comando?
Quiero especificar la precisión del número de salida: el recuento de dígitos fraccionarios.
Redondear 6.66
a precisión 1
debería dar 6.7
, por ejemplo. Más en la tabla a continuación:
Value Precision Rounded
6.66 0 7
6.66 1 6.7
6.66 2 6.66
6.66 3 6.660
6.666 3 6.666
6.6666 3 6.667
Debería ser utilizable en un shell interactivo, pero idealmente lo suficientemente robusto para usarlo en scripts de shell de producción.
bash
command-line
arithmetic
floating-point
Volker Siegel
fuente
fuente
awk
.Respuestas:
Redondeo de números de coma flotante
¿Qué significa "redondear un número de coma flotante"?
Eso es fácil, obviamente ... ¿Dónde está mi libro de matemáticas de la escuela ...
No, ya sabemos que nada relacionado con los números de coma flotante es fácil:
Para empezar, hay múltiples modos de redondeo:
¿Cómo manejar las vitrinas? ¿Cómo saber cuáles son los casos de esquina?
OK, parece que mejor usamos una implementación del estándar IEEE 754 y dejamos que nuestro sistema se encargue de eso.
Para redondear un número de coma flotante en el shell, basado en la aritmética de coma flotante estándar, necesitamos tres pasos:
Resulta que el comando de shell
printf
puede hacer todo esto. Se puede usar para imprimir números de acuerdo con una especificación de formato como se describe enman 3 printf
. Los números se redondean implícitamente en la forma estándar si es necesario para el formato de salida:El comando
Redondear
x
ap
precisión de dígitos con entrada como argumentos de línea de comando:O en una tubería de shell, con entrada de
x
entrada estándar yp
como argumento:Ejemplos:
Trampas malas
¡Cuidado con la configuración regional! Especifica el separador entre la parte integral y la fracción: la
.
, como es de esperar.Pero mira lo que sucede en una localidad alemana, por ejemplo:
Sí, así es
6,667
, seis coma seis seis siete. Eso arruinaría tu script con seguridad.(Pero solo para los dos clientes en Alemania. A excepción de las máquinas del desarrollador que actualmente depuran para estos clientes).
Más robusto
Para hacerlo más robusto, use:
o
Esto también utiliza en
/usr/bin/printf
lugar del shell incorporadobash
ozsh
para evitar inconsistencias menores en la implementación de lasprintf
variantes, y evita un efecto muy sucio cuando, en un entorno local alemán,LC_ALL
se establece, pero no se exporta. Entonces, el builtin usa,
, y/usr/bin/printf
usa.
...Consulte también
%g
para redondear a un número específico de dígitos significativos.fuente
Lo siguiente funcionó para mí.
fuente