![]() |
|
Модераторы: bsa |
![]()
|
|
| odys |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 9.11.2008 Репутация: нет Всего: нет |
Почему функция так странно округляет...
Программа должна из числа 5.22 доставать 22 (тобиш дробную часть брать как целове число)
вот что она выводит Vvedite comandy 5.22 drob = 0.22 int drob = 0 comanda = 5.22 int_comanda = 5 comanda - double(int_comanda) = 0.22 comanda = 2.2 int_comanda = 2 drob = 2.2 int_drob = 2 comanda - double(int_comanda) = 0.2 comanda = 2 int_comanda = 1 drob = 22 int_drob = 21 comanda - double(int_comanda) = 1 comanda = 10 int_comanda = 9 drob = 220 int_drob = 219 ... и т д Собственно вопрос по выделенному красным... почему 2 округляется до 1? Вопрос конечно решаем... делается следующая замена в цикле while и return; while( ((comanda - double(int_comanda)) > 0.0001) && ((comanda - double(int_comanda))) < 0.9999) return int_drob+1; Но блин... почему так округляется? 5.1 сразу ахинею выдает... 5.222 -> 222 нормально, на 5.2222 - снова ахинея, 5.22222 - нормально и т д по четности. Я так понимаю это связано с особенностями double... и возможно там не 2 а 1.9999999999, поэтому и округляет до 1... но как с этим бороться? Как изменить функцию я знаю... что -то в этом роде while( ((comanda - double(int_comanda)) > 0.0001) && ((comanda - double(int_comanda)) < 0.999)) и дальше немного в теле поизменять... Интересует сама причина этого Это сообщение отредактировал(а) odys - 22.11.2008, 17:27 |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
мантиса всегда представлена точно ошибка происходит при преобразовании float в double http://forum.vingrad.ru/forum/topic-236923...0%B8%D0%B5.html |
|||
|
||||
| sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Не пудри себе мозги, не изобретай велосипед, это немного так сказать неправильно. Используй мою функцию, передовая ей аргумент с точкой в типе char и получишь обратно дробную часть. далее с помощью static_cast<int>(result) - если надо переводишь в int и радуешься |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |