2018年10月26日金曜日

マクロステートメント「%IF」の落とし穴





落とし穴の例


以下、%IFで「1」と「1.0」が等しいかどうかを評価しています。(結果は等しくないって出ちゃいます)

%macro test;
        %if 1 = 1.0  %then %put Equal; %else %put Unequal;
%mend;
%test

ログ
Unequal





以下、%IFで「3 / 2」と「1」が等しいかどうかを評価しています。(結果は等しいって出ちゃいます)

%macro test;
        %if (3 / 2) = 1  %then %put Equal; %else %put Unequal;
%mend;
%test

ログ
Equal 




%IFの挙動

・評価する値がすべて整数の場合、「数値」として評価が行われる。
例)「2 < 3」「(1 + 2) = 3」


・評価する値がすべて整数でも、割り算等の式が含まれていて計算結果が小数になる場合、小数部分を破棄してから評価が行われる。
例)「(3 / 2) = 1」… 3 / 2 → 1.5 → 1


・評価する値に小数や文字を含む場合、「文字値」として評価が行われる。
例)「1 < 1.0」「a < b」




小数を扱う場合、以前紹介した「%sysevalf関数」を使います。
http://sas-boubi.blogspot.com/2016/08/11-evalsysevalf.html

%macro test;
        %if %sysevalf( 1 = 1.0 ) %then %put Equal; %else %put Unequal;
%mend;
%test

ログ
Equal



%macro test;
        %if %sysevalf( (3 / 2) = 1 )  %then %put Equal; %else %put Unequal;
%mend;
%test

ログ
Unequal

0 件のコメント:

コメントを投稿