double a;
a = 3669.0;
int b;
b = a;
Я получаю 3668 в b, вместо 3669.
Как исправить эту проблему? И если у меня есть 3559.8, я тоже хочу как 3559 не 3560.
double a;
a = 3669.0;
int b;
b = a;
Я получаю 3668 в b, вместо 3669.
Как исправить эту проблему? И если у меня есть 3559.8, я тоже хочу как 3559 не 3560.
Я подозреваю, что у вас на самом деле нет этой проблемы - я подозреваю, что у вас действительно есть:
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, то вполне возможно (вероятно, я бы сказал), что это то, что происходит.
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 :
Это печально известная проблема округления с плавающей запятой. Просто добавьте очень небольшое число, чтобы исправить проблему.
double a;
a=3669.0;
int b;
b=a+ 1e-9;
int b;
double a;
a=3669.0;
b=a;
printf("b=%d",b);
этот код дает результат как b = 3669, только вы его четко проверяете.