Автор | Сообщение |
|
| |
Пост N: 5
Зарегистрирован: 04.11.11
|
|
Отправлено: 09.11.11 06:20. Заголовок: Вопрос про сравнение двух переменных типа double?
Есть такая строчка кода: цитата: | if(zv3 == NormalizeDouble((Low-(down+4)*Point),Digits)) |
| Причём: цитата: | Alert: zv3 = 1.3768 NormalizeDouble((Low-(down+4)*Point),Digits) = 1.3768 |
| Вопрос: Почему оператор if даёт FALSE?
|
|
|
Ответов - 2
[только новые]
|
|
|
| постоянный участник
|
Пост N: 229
Зарегистрирован: 03.09.09
|
|
Отправлено: 09.11.11 11:34. Заголовок: genbachae пишет: По..
genbachae пишет: цитата: | Почему оператор if даёт FALSE? |
| Функции Alert и Print производят округление всех значений типа double до 4-х знаков после запятой. Поэтому вы не видите истинное значение zv3. Чтобы увидеть все значащие цифры выводите значение zv3 при помощи такого оператора: цитата: | Alert("zv3 = ", DoubleToStr(zv3, 16)); |
| Наилучший способ сравнения двух переменных типа double - сравнение их разности с некоторой минимальной величиной. Например, если вы сравниваете две цены, то достаточно сравнить их разницу с величиной Point: цитата: | double a = ....; double b = ...; if (MathAbs(a - b) >= Point) { // значения не равны } else { // значения равны } |
|
|
|
|
|
Отправлено: 09.11.11 11:56. Заголовок: genbachae пишет: По..
genbachae пишет: цитата: | Почему оператор if даёт FALSE? |
|
Видимо, потому, что значение zv3 не нормализовано. Если нормализовать оба сравниваемые значения, то if() будет возвращать true.
|
|
|
|