Столкнулся с такой ситуацией и никак не могу понять как ее разрешить. Может поможете.
есть код:
double tmp = 36.745*100 + 0.5; // равно 3675
cout << tmp << endl; // выводит 3675
cout << static_cast<long>(tmp) << endl; // выводит 3674
Никак не могу понять, куда девается единица.
Может кто сталкивался с такой проблемой.
И что интересно, похожий код с другим числом, например, 240.875 отрабатывает нормально.
Здравствуйте, da0s, Вы писали:
D>есть код:
D>double tmp = 36.745*100 + 0.5; // равно 3675
Ошибка в комментарии
tmp не равно 3675.
Выведи разницу и убедись:
cout << 3675 - tmp << endl;
Здравствуйте, da0s, Вы писали:
Как вариант, нашел временное решение:
double tmp = 36.745*100 + 0.505;
cout << tmp << endl; // выводит 3675
cout << static_cast<long>(tmp) << endl; // выводит 3675
Здравствуйте, watch-maker, Вы писали:
WM>Здравствуйте, da0s, Вы писали:
D>>есть код:
WM>D>>double tmp = 36.745*100 + 0.5; // равно 3675
WM>
WM>Ошибка в комментарии
WM>tmp не равно 3675.
WM>Выведи разницу и убедись:
WM>cout << 3675 - tmp << endl;
Спасибо, я так и думал, что дело в хранении числа с плавающей точкой.
Здравствуйте, da0s, Вы писали:
D>D>double tmp = 36.745*100 + 0.5; // равно 3675
D>
D>Никак не могу понять, куда девается единица.
D>Может кто сталкивался с такой проблемой.
очевидно, то, что ты там считал, не было представимо в виде точной двоичной дроби.
Если ты уверен, что в результате твоих вычислений должно получиться целое число — используй функции округления
round или
rint.
Приведение к целому обычно реализует простое отбрасывание дробной части, какой бы она ни была.