С++: как округлить двойной к int?
Возможный дубликат:
round() для float в С++
У меня есть двойной (назовите его x), который должен быть 55, но на самом деле сохранен как 54.999999999999943157, который я только что понял.
Итак, когда я делаю
double x = 54.999999999999943157;
int y = (int) x;
y = 54 вместо 55!
Это озадачило меня в течение долгого времени. Как мне его правильно округлить?
Ответы
Ответ 1
добавьте 0.5 перед литьем (если x > 0) или вычтите 0.5 (если x < 0), потому что компилятор всегда будет усекать.
float x = 55; // stored as 54.999999...
x = x + 0.5; // x is now 55.499999...
int y = (int)x; // truncated to 55
С++ 11 также вводит std:: round, который, вероятно, использует аналогичную логику добавления 0.5 к | x | под капотом (см. ссылку, если она заинтересована), но, очевидно, более надежна.
Может возникнуть вопрос о том, почему float не хранится точно как 55. Для пояснения см. этот ответ stackoverflow.
Ответ 2
Кастинг не является математической операцией и не ведет себя как таковой. Попробуйте
int y = (int)round(x);
Ответ 3
Приведение к int
обрезает значение. Добавление 0.5
заставляет его делать правильное округление.
int y = (int)(x + 0.5);
Ответ 4
Стоит отметить, что то, что вы делаете, не округляет, а бросает. Кастинг с использованием (int) x
сокращает десятичное значение x
. Как и в вашем примере, если x = 3.9995
, .9995
получает усечение и x = 3
.
Как было предложено многими другими, одним из решений является добавление 0.5
в x
, а затем литье.
Ответ 5
#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;
}