2012-10-05 38 views
8

Estoy tratando de imprimir el número 684.545007 con 2 puntos de precisión en el sentido de que el número se trunca (no redondeado) después de 684.54.Cómo truncar un número de punto flotante después de un cierto número de posiciones decimales (sin redondeo)?

Cuando uso

var = 684.545007; 
printf("%.2f\n",var); 

emite 684.55, pero lo que me gustaría conseguir es 684.54.

¿Alguien sabe cómo puedo corregir esto?

+4

¿Por qué esperabas un 4? – chris

+9

Si esperaba '684.54', entonces esperaba el resultado incorrecto. Es así de simple. –

+0

Porque no quiero un valor redondeado. Este código es parte de una solución de código de jueces en línea de programación. – vhbsouza

Respuesta

22

Lo que estás buscando es truncation. Esto debería funcionar (al menos para números que no son terriblemente grande):

printf(".2f", ((int)(100 * var))/100.0); 

La conversión a número entero trunca la parte fraccionaria.

En C++ 11 o C99, puede utilizar la función dedicada trunc para este propósito (de la cabecera <cmath> o <math.h>. Esto evitará la restricción a los valores que encajan en un tipo entero.

std::trunc(100 * var)/100  // no need for casts 
+0

Si tiene una biblioteca estándar C99, puede usar 'trunc()', que funcionará para un rango de números mucho mayor. – caf

+0

@caf: Gracias, agregué eso. Me pregunto si alguien sugerirá 'lrint()' para la primera solución. –

1
printf("%.2f\n", var - 0.005); 
+9

Dado que .005 no es representable exactamente, esto está obligado a producir el resultado incorrecto para unos pocos valores. –

2

Aquí es mi enfoque. parece feo, pero funciona en la mayoría de los casos por ejemplo var puede ser más grande int, puede ser cero o extraña '-0'. no maneja infinitos y NaNs sin embargo.

double var = 684.545007; // or whatever 
double var_trunc = var>=0. ? floor(var*100.)/100. : ceil(var*100.)/100.; 
printf ("%g\n", var_trunc); 
Cuestiones relacionadas