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

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

Tengo un doble (llámalo x), que significa 55 pero en realidad está almacenado como 54.999999999999943157 del cual me acabo de dar cuenta.

Entonces cuando lo hago

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

y = 54 en lugar de 55!

Esto me desconcertó por un largo tiempo. ¿Cómo lo hago para redondear correctamente?

agregue 0.5 antes del lanzamiento (si x> 0) o reste 0.5 (si x <0), porque el compilador siempre 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 de agregar 0.5 a | x | bajo el capó (ver 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 55. Para obtener una explicación, consulte esta respuesta de stackoverflow.

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

 int y = (int)round(x); 

Casting 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 está redondeando, está emitiendo. Casting usando (int) x trunca el valor decimal de x . Como en tu ejemplo, si x = 3.9995 , el .9995 se trunca y x = 3 .

Tal como lo propusieron muchos otros, una solución es agregar 0.5 a x luego emitir.

 #include  #include  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; }