C++: как округлить double до int? [дубликат]


Возможные Дубликаты:
round () для float в C++

у меня есть двойной (назовите его x), предназначенный для 55, но на самом деле хранится как 54.999999999999943157, который я только что понял.

поэтому, когда я делаю

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

y = 54 вместо 55!

это озадачило меня надолго. Как мне получить его правильно круглый?

5 67

5 ответов:

добавить 0.5 перед заливкой (если x > 0) или вычесть 0.5 (если x

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 вводит std:: round, который, вероятно, использует аналогичную логику добавления 0.5 к| x / под капотом (см. ссылку, если интересно), но, очевидно, более надежен.

следующий вопрос может быть почему поплавок не хранится как точно 55. Для объяснения см. этой stackoverflow ответ.

литье не является математической операцией и не ведет себя как таковая. Попробуй

int y = (int)round(x);

приведение к int усекает значение. Добавление 0.5 заставляет его делать правильное округление.

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

стоит отметить, что то, что вы делаете, это не округление, это кастинг. Кастинг с помощью (int) x усекает десятичное значение x. Как и в вашем примере, если x = 3.9995 на .9995 урезалось и x = 3.

как предлагают многие другие, одним из решений является добавление 0.5 до x, а затем бросил.

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