Ответ 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, то вполне возможно (вероятно, я бы сказал), что это то, что происходит.