Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Ввод данных типа Single  (Прочитано 419 раз)

Серега

  • Постоялец
  • ***
  • Сообщений: 249
    • Просмотр профиля
Ввод данных типа 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.
Можете пояснить?

ZWolol

  • Пользователь
  • **
  • Сообщений: 51
    • Просмотр профиля
Re: Ввод данных типа Single
« Ответ #1 : 26 Марта 2025, 02:58:41 »
Все дробные переменные хранятся в формате float или double.
У них разное количество действующих знаков и 0.5 float меньше чем 0.5 double.

Если ты сравниваешь переменную float с введенным числом в double, то они не совпадут.
Поэтому дробные значения не сравниваются на равенство.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1301
    • Просмотр профиля
Re: Ввод данных типа Single
« Ответ #2 : 26 Марта 2025, 10:17:19 »
Здравствуйте.

Цитировать
Создал переменные, скрипты, мнемосхему. И при вводе в поле например значения 100.1 должен сработать скрипт. Но не срабатывает.
О вещественных типах можно прочесть по ссылке. Там же рассмотрены примеры формирования вещественного значения и сравнения вещественных типов. Для корректного сравнения можно перевести значение переменной в целое число (если это допустимо), затем можно производить необходимые сравнения. Пример скрипта для работы с вещественной переменной можно найти по ссылке.
Второй вариант, если нужно сравнивать именно вещественные значения, то нужно допускать погрешность, например:
Код: (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.
« Изменён: 26 Марта 2025, 10:27:28 от Simple-Scada »

Серега

  • Постоялец
  • ***
  • Сообщений: 249
    • Просмотр профиля
Re: Ввод данных типа Single
« Ответ #3 : 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.

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Ввод данных типа Single
« Ответ #4 : 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
...
« Изменён: 26 Марта 2025, 15:43:59 от pan2000 »

Серега

  • Постоялец
  • ***
  • Сообщений: 249
    • Просмотр профиля
Re: Ввод данных типа Single
« Ответ #5 : 26 Марта 2025, 15:59:36 »
Спасибо! будем пробывать