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

Как преобразовать double в int в C?

double a;
a = 3669.0;
int b;
b = a;

Я получаю 3668 в b, вместо 3669.

Как исправить эту проблему?  И если у меня есть 3559.8, я тоже хочу как 3559 не 3560.

4b9b3361

Ответ 1

Я подозреваю, что у вас на самом деле нет этой проблемы - я подозреваю, что у вас действительно есть:

double a = callSomeFunction();
// Examine a in the debugger or via logging, and decide it 3669.0

// Now cast
int b = (int) a;
// Now a is 3668

Что заставляет меня сказать, что хотя верно, что многие десятичные значения не могут быть сохранены точно в float или double, что не выполняется для целых чисел такого типа. Они могут быть легко представлены в виде двоичной формы с плавающей точкой. (Очень большие целые числа не всегда могут быть точно представлены, но здесь мы не имеем дело с очень большим целым числом.)

Я сильно подозреваю, что ваше значение double на самом деле немного меньше 3669.0, но оно отображается вам как 3669.0 любым диагностическим устройством, которое вы используете. Преобразование в целочисленное значение просто выполняет усечение, а не округление - следовательно, проблема.

Предполагая, что ваш тип double является 64-битным типом IEEE-754, наибольшее значение, которое меньше 3669.0, в точности соответствует

3668.99999999999954525264911353588104248046875

Итак, если вы используете какой-либо диагностический подход, когда это значение будет отображаться как 3669.0, то вполне возможно (вероятно, я бы сказал), что это то, что происходит.

Ответ 2

main() {
    double a;
    a=3669.0;
    int b;
    b=a;
    printf("b is %d",b);

}

: b is 3669

когда вы пишете b = a; то его автоматически преобразуется в int

see on-line compiler result : 

http://ideone.com/60T5b

Ответ 3

Это печально известная проблема округления с плавающей запятой. Просто добавьте очень небольшое число, чтобы исправить проблему.

double a;
a=3669.0;
int b;
b=a+ 1e-9;

Ответ 4

int b;
double a;
a=3669.0;
b=a;
printf("b=%d",b);

этот код дает результат как b = 3669, только вы его четко проверяете.