Показать сообщение отдельно
  #2  
Старый 28.04.2011, 21:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

вообще, как известно, типы extended, double и, соответсвенно, алиас real и ему подобные не является ТОЧНЫМ типом, т.е. там значение может "чуть-чуть" отличаться от того, которое отображается при выводе (и, соответсвенно, от того, которое было помещено в переменную).

Решение данной проблемы обычно таково:
Вариант 1. Использовать типы с фиксированной точкой. Для твоих значений за глаза хватит типа Currency (4 знака после точки).
Вариант 2. Сравнивать не на равно, а на попадание в диапазон:
Код:
const
  Epsln = 0.03; // для шага 0.1 достаточно.

var
  A, B : Double;

begin
  A := 0.3;
  B := A + 0.00001; // при выводе %1.1f будет тоже 0.3

  If A = B 
    Then ShowMessage(' = True')
     Else ShowMessage(' = False');

  If Abs(A-B) < Epsln 
    Then ShowMessage(' == True')
     Else ShowMessage(' == False');
end;
Ответить с цитированием