Подтвердить что ты не робот

С++: как округлить двойной к int?

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

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

Итак, когда я делаю

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

y = 54 вместо 55!

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

4b9b3361

Ответ 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;
}