round redondear entero decimals c++ floating-point rounding

entero - C++: ¿Cómo redondear un doble a un int?



redondear a entero en c++ (5)

Posible duplicado:
redondo () para flotar en C ++

Tengo un doble (llámelo x), destinado a ser 55, pero en realidad está almacenado como 54.99999999999999943157, lo cual me di cuenta.

Así que cuando lo hago

double x = 54.999999999999943157; int y = (int) x;

y = 54 en lugar de 55!

Esto me desconcertó durante mucho tiempo. ¿Cómo lo hago para redondear correctamente?


El casting no es una operación matemática y no se comporta como tal. Tratar

int y = (int)round(x);


La conversión a un int trunca el valor. Agregar 0.5 hace que se redondee correctamente.

int y = (int)(x + 0.5);


Vale la pena señalar que lo que estás haciendo no es redondear, es lanzar. La conversión utilizando (int) x trunca el valor decimal de x . Como en su ejemplo, si x = 3.9995 , el .9995 se trunca y x = 3 .

Según lo propuesto por muchos otros, una solución es agregar 0.5 a x , y luego lanzar.


agregue 0.5 antes de lanzar (si x> 0) o reste 0.5 (si x <0), porque el compilador siempre se truncará.

float x = 55; // stored as 54.999999... x = x + 0.5; // x is now 55.499999... int y = (int)x; // truncated to 55

C ++ 11 también introduce std::round , que probablemente usa una lógica similar para agregar 0.5 a | x | debajo del capó (vea el enlace si está interesado) pero obviamente es más robusto.

Una pregunta de seguimiento podría ser por qué el flotador no se almacena exactamente como 55. Para obtener una explicación, consulte this respuesta de .


#include <iostream> #include <cmath> using namespace std; int main() { double x=54.999999999999943157; int y=ceil(x);//The ceil() function returns the smallest integer no less than x return 0; }