¿Cómo puedo restringir un valor flotante a sólo dos lugares después del punto decimal en C?

Resuelto asked hace 15 años • 0 respuestas

¿Cómo puedo redondear un valor flotante (como 37,777779) a dos decimales (37,78) en C?

 avatar Aug 28 '09 04:08
Aceptado

Si solo desea redondear el número para fines de salida, entonces la "%.2f"cadena de formato es la respuesta correcta. Sin embargo, si realmente desea redondear el valor del punto flotante para realizar más cálculos, algo como lo siguiente funciona:

#include <math.h>

float val = 37.777779;

float rounded_down = floorf(val * 100) / 100;   /* Result: 37.77 */
float nearest = roundf(val * 100) / 100;  /* Result: 37.78 */
float rounded_up = ceilf(val * 100) / 100;      /* Result: 37.78 */

Tenga en cuenta que existen tres reglas de redondeo diferentes que quizás desee elegir: redondear hacia abajo (es decir, truncar después de dos decimales), redondear al más cercano y redondear hacia arriba. Por lo general, desea redondear al más cercano.

Como varios otros han señalado, debido a las peculiaridades de la representación de punto flotante, estos valores redondeados pueden no ser exactamente los valores decimales "obvios", pero serán muy, muy parecidos.

Para obtener mucha (¡mucha!) más información sobre el redondeo y, especialmente, sobre las reglas de desempate para redondear al más cercano, consulte el artículo de Wikipedia sobre Redondeo .

Dale Hagglund avatar Aug 27 '2009 23:08 Dale Hagglund

Usando %.2f en printf. Sólo imprime 2 puntos decimales.

Ejemplo:

printf("%.2f", 37.777779);

Producción:

37.77
Andrew Coleson avatar Aug 27 '2009 21:08 Andrew Coleson

Suponiendo que está hablando del valor redondeado de la impresión, la respuesta de Andrew Coleson y AraK es correcta:

printf("%.2f", 37.777779);

Pero tenga en cuenta que si su objetivo es redondear el número exactamente a 37,78 para uso interno (por ejemplo, para compararlo con otro valor), entonces no es una buena idea, debido a la forma en que funcionan los números de coma flotante: normalmente no Si desea hacer comparaciones de igualdad para punto flotante, utilice en su lugar un valor objetivo +/- un valor sigma. O codifique el número como una cadena con una precisión conocida y compárelo.

Vea el enlace en la respuesta de Greg Hewgill a una pregunta relacionada , que también explica por qué no debería utilizar punto flotante para cálculos financieros.

John Carter avatar Aug 27 '2009 21:08 John Carter

Qué tal esto:

float value = 37.777779;
float rounded = ((int)(value * 100 + .5) / 100.0);
Daniil avatar Aug 27 '2009 23:08 Daniil