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

Цитата:
Сообщение от NumLock
Эта ситуация уже очень много раз обсуждалась.

Нам, хотя бы в кратце можно и повторить.
В общем случае сравнение чисел с плавающей точкой это не точная операци, т.к. в силу представления чисел внутри компьютера 1 может быть не равно 1, т.к. реальное значение в зависимости от вычисления будет действительно не равно:
Код:
0.9999999999999 <> 1.000000000001
В примере, эти два числа не равны друг другу, но в силу округления тебе оба они выводяться как "1".
Соотвественно, решением проблемы может быть:
1. Перевод в целое или дробное с фиксированной точкой
2. Сравнение через Epsilon (т.е. с указанной точностью)
Например, в первом случае либо переводим в тип Currency (как пример) или, если мы уверены в порядке значения, то в Integer, умножая значение на, например, 1000.
Для второго случая, определем эпсилон и сравниваем разницу:
Код:
const
  epsilon = 0.000001;
...
  if abs(abs(y)-1.2) < epsilon then label1.caption := 'y = 1.2' else label1.caption := 'y <> 1.2';
Ответить с цитированием