Что больше 100 или 11.1 ? Хитрости сравнения макропеременных.

Всем привет.

logo

 

Сегодня рассмотрим казусный момент сравнение макропеременных и в чем нужно быть внимательным.

И так поехали:

Для начала зайдем на страничку sas и возьмем от туда пример кода:

%macro compare(first,second);
   %if &first>&second %then %put &first > &second;
   %else %if &first=&second %then %put &first = &second;
   %else %put &first<&second;
%mend compare;

Данный макрос является рабочим при работе  с целыми значениями.

Мы можем в этом убедиться, запустив сравнение например 11 и 100:

%compare(11,100);

Результатом будет в логе:

MLOGIC(COMPARE): %IF condition (&first>&second) is FALSE
MLOGIC(COMPARE): %IF condition &first=&second is FALSE

11<100

Теперь давайте запустим тоже самое, только сравнивать будем 11.1 и 100, т.е. дробное значение и целое:

%compare(11.1,100);

Получаем результат:

MLOGIC(COMPARE): %IF condition (&first>&second) is TRUE

11.1 > 100

т.е. 11 целых и 1 десятая стала больше 100.

Вот такие дела.

Для того чтобы избежать такой ошибки нужно воспользоваться функцией %sysevalf

давайте изменим наш макрос на следующий:

%macro compare(first,second);
 %if %sysevalf(&first>&second) %then %put &first > &second;
 %else %if &first=&second %then %put &first = &second;
 %else %put &first<&second;
%mend compare;

И запустим еще раз пример сравнения 11.1 и 100:

MLOGIC(COMPARE): %IF condition %sysevalf(&first>&second) is FALSE
MLOGIC(COMPARE): %IF condition &first=&second is FALSE

11.1<100

Теперь все отработало так как надо.

Так что будьте внимательны.

P.S. Подпишитесь и получайте новые сватьи в день выхода.

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.