Приведение к целочисленному типу
От: da0s  
Дата: 06.11.12 10:25
Оценка:
Столкнулся с такой ситуацией и никак не могу понять как ее разрешить. Может поможете.

есть код:


double tmp = 36.745*100 + 0.5;  // равно 3675
cout << tmp << endl;            // выводит 3675
cout << static_cast<long>(tmp) << endl; // выводит 3674



Никак не могу понять, куда девается единица.
Может кто сталкивался с такой проблемой.

И что интересно, похожий код с другим числом, например, 240.875 отрабатывает нормально.
Re: Приведение к целочисленному типу
От: watch-maker  
Дата: 06.11.12 10:33
Оценка: 3 (1)
Здравствуйте, da0s, Вы писали:

D>есть код:

D>double tmp = 36.745*100 + 0.5;  // равно 3675

Ошибка в комментарии
tmp не равно 3675.
Выведи разницу и убедись:
cout << 3675 - tmp << endl;
Re: Приведение к целочисленному типу
От: da0s  
Дата: 06.11.12 10:36
Оценка: :))) :))
Здравствуйте, da0s, Вы писали:

Как вариант, нашел временное решение:

double tmp = 36.745*100 + 0.505;  
cout << tmp << endl;            // выводит 3675
cout << static_cast<long>(tmp) << endl; // выводит 3675
Re[2]: Приведение к целочисленному типу
От: da0s  
Дата: 06.11.12 10:40
Оценка:
Здравствуйте, 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;


Спасибо, я так и думал, что дело в хранении числа с плавающей точкой.
Re[3]: Приведение к целочисленному типу
От: da0s  
Дата: 06.11.12 10:42
Оценка:
D>Здравствуйте, watch-maker, Вы писали:
WM>Ошибка в комментарии
WM>tmp не равно 3675.
WM>Выведи разницу и убедись:
отладчик с толку сбил.
Re: Приведение к целочисленному типу
От: jazzer Россия Skype: enerjazzer
Дата: 06.11.12 10:50
Оценка:
Здравствуйте, da0s, Вы писали:

D>
D>double tmp = 36.745*100 + 0.5;  // равно 3675
D>


D>Никак не могу понять, куда девается единица.

D>Может кто сталкивался с такой проблемой.

очевидно, то, что ты там считал, не было представимо в виде точной двоичной дроби.
Если ты уверен, что в результате твоих вычислений должно получиться целое число — используй функции округления round или rint.
Приведение к целому обычно реализует простое отбрасывание дробной части, какой бы она ни была.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.