Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение вещественных чисел, Проблемы с округлением 
:(
    Опции темы
gray_k
Дата 9.6.2003, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22



Такая проблема. Есть два числа типа double(это суммы в рублях). Как их корректно сравнить. Я пробовал так:
if(int(summa*1000) == int(itog*1000))
и ещё:
if((int(summa*1000) >> 2) == (int(itog*1000)>>2))
Но всё равно иногда условие не срабатывало при вобщем-то равных значениях правой и левой половины условия(смотрел в дебагере). Проблему-то в общем решил, использовав приведение к типу Currency. Но хотелось бы знать, а как такую проблему решить, используя только стандартные типы данных С++.
Работаю в С++ Builder (хотя в данном случая какая блин разница? confused.gif )


--------------------
С уважением.
Gray.
PM MAIL   Вверх
kruchinin
Дата 9.6.2003, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 19.4.2003

Репутация: нет
Всего: нет



Сравнить их нельзя.
Можно лишь до какого-то предела.
например

if ((summa<itog+0.0000001) && (summa>itog-0.0000001)) ...
к примеру
PM MAIL   Вверх
DENNN
Дата 9.6.2003, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Цитата
Сравнить их нельзя.

С каких это пор два числа нельзя сравнить? smile.gif
Тем более одного типа?!!
PM ICQ   Вверх
DENNN
Дата 9.6.2003, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Из вопроса многое не ясно, но я понял что у gray_k проблемы с точностью.
Опять из предположений: необходимо произвести сравнение с точностью до 4 знака. smile.gif
Предлагаю "дибильный" вариант сравнения на равенство:
Код

if (fabs(summa-itog)<0.0001)
   MessageBox("Они равны");
else
//какое-то из чисел больше - как сравнить догадаешься и сам :)

PM ICQ   Вверх
Fantasist
Дата 9.6.2003, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
С каких это пор два числа нельзя сравнить?


С тех пор как они с плавающей точкой. Нельзя не в том смысле, что нельзя написать double1==double2, а в том смысле, что в связи с представлением чисел с плавающей точкой два числа редко окажуться одинаковыми, даже если они в принципе равны. То есть сравнивниванение имеет смысл только с какой-то погрешностью. Ну в общем, вы и сами знаете.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.