Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Серега от 25 Марта 2025, 17:01:16

Название: Ввод данных типа Single
Отправлено: Серега от 25 Марта 2025, 17:01:16
Добрый день!
В ходе экспериментов для одной идеи наткнулся на не совсем понятное поведение.
Создал переменные, скрипты, мнемосхему. И при вводе в поле например значения 100.1 должен сработать скрипт. Но не срабатывает.
Начал выяснять и получается что я набираю 100.1 а отображается в поле значение 100.099998 (это уже в настройках поставил 6 знаков после запятой чтобы увидеть).
При этом небольшое тестирование показало, что для переменной типа Single до значения 32 все нормально.
Поясню. Если вводим 19.1 то и отображается 19.1. Вводим 31.1 отображается 31.1. Но если 32.1 и больше, то отображается 32.099998.
Можете пояснить?
Название: Re: Ввод данных типа Single
Отправлено: ZWolol от 26 Марта 2025, 02:58:41
Все дробные переменные хранятся в формате float или double.
У них разное количество действующих знаков и 0.5 float меньше чем 0.5 double.

Если ты сравниваешь переменную float с введенным числом в double, то они не совпадут.
Поэтому дробные значения не сравниваются на равенство.
Название: Re: Ввод данных типа Single
Отправлено: Simple_Scada от 26 Марта 2025, 10:17:19
Здравствуйте.

Цитировать
Создал переменные, скрипты, мнемосхему. И при вводе в поле например значения 100.1 должен сработать скрипт. Но не срабатывает.
О вещественных типах можно прочесть по ссылке (http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374). Там же рассмотрены примеры формирования вещественного значения и сравнения вещественных типов (http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374#:~:text=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%C2%AB%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE%C2%BB%20%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2). Для корректного сравнения можно перевести значение переменной в целое число (если это допустимо), затем можно производить необходимые сравнения. Пример скрипта для работы с вещественной переменной можно найти по ссылке (https://simple-scada.com/help/script/colorchange.html?anchor=realvar).
Второй вариант, если нужно сравнивать именно вещественные значения, то нужно допускать погрешность, например:
Код: (delphi)
var
  A, B: Single;
begin
  A := 1.0 / 3.0;
  B := 0.33333333;

  // считаем значения одинаковыми, если разница между ними меньше 0.00000001
  if Abs(A - B) < 0.00000001 then
    AddMessage(Now, mkMessage, 'Значения равны', True, False)
  else
    AddMessage(Now, mkMessage, 'Значения не равны', True, False);
end.
Название: Re: Ввод данных типа Single
Отправлено: Серега от 26 Марта 2025, 14:20:46
В проекте я использовал вот такую конструкцию:
Код
     case Trunc(PositionTC.Value * 10) of
        0..160      : wNumberPlace.Value := 1;
        161..1000   : wNumberPlace.Value := 2;
        1001..5000  : wNumberPlace.Value := 3;
        5001..7000  : wNumberPlace.Value := 4;
        7001..10000 : wNumberPlace.Value := 5;
      end;
и получается как бы физически объект находиться на позиции 100.1 это уже 3 участок, оператор вводит 100.1, но у нас получается 100.099998 и нарушается логическая цепочка.
Я так понимаю в моем случае надо все делать через if.
Название: Re: Ввод данных типа Single
Отправлено: pan2000 от 26 Марта 2025, 15:15:41
   Здравствуйте.

  Для ограниченного набора возможных значений переменной ввода (в Вашем случае 10001 значение) можно использовать целочисленную переменную PositionTC со сдвигом запятой -1.
Код: (delphi)
begin
   case PositionTC.AsVariant of
        0..160      : wNumberPlace.Value := 1;
        161..1000   : wNumberPlace.Value := 2;
        1001..5000  : wNumberPlace.Value := 3;
        5001..7000  : wNumberPlace.Value := 4;
        7001..10000 : wNumberPlace.Value := 5;
      end;
end.

Для вещественной переменной можно использовать округление до ближайшего целого:
Код: (delphi)
...
  case Round(PositionTC_1.AsSingle * 10) of
...
Название: Re: Ввод данных типа Single
Отправлено: Серега от 26 Марта 2025, 15:59:36
Спасибо! будем пробывать