2017-07-27 14 views
2

SASにマクロが正しく動作しません。マクロ変数の値が固定数よりも大きい場合にトリガされる%goto文があります。マクロ変数は、次のサンプルコードによって作成されます。SASマクロ変数科学記法との論理比較

表を開くとき、num変数の数値は標準表記(例:645,435,243)です。ただし、マクロ変数& num。それを6.4544E8とする。これにより、SASがこの値を1,000,000などの数値と比較しようとしたときに問題が発生します。

私は以下の単純なマクロでこの問題を再現できましたが、唯一の違いはマクロ変数に値が割り当てられる方法です。以下のコードでは、proc SQL文ではなくj 1E8を直接割り当てます。

私の質問はこれです:なぜSASは1E8> 5を正しく評価できないのですか?

+0

SASマクロ変数は単なるテキストです。 SASマクロは、より多くのテキストを生成するだけです。 – david25272

答えて

2

%if &j > 5は「数学的」比較を実行するのではなく、効果的にテキスト比較を実行するためです。通常の古い%evalは整数の計算だけを行い、比較は基本的には2つのものをテキストとして比較しているだけです。 SASマクロ変数は、ほとんどの場合テキスト以外のものではなくテキストとして扱われます。したがって、常に%sysevalfを使用してください。

SASがマクロ変数の内容を実数として扱うには、%sysevalfを使用する必要があります。

%if &i. >= 7 %then %do; 
    %if %sysevalf(&j. > 5,boolean) %then %do; 
     %goto done; 
    %end; 
%end; 

あなたが%let j = 7E8;を選択した場合、動作するように見えただろうことに注意してください - それは唯一の75を比較していますし、それが本当だから。

さらに、%let J = 5E8;は大きいです - Eは何もありません - しかし、&j > 5Aを比較すると、それはまだ動作しますが、&j > 5Fは動作しません。そこで、E(文字)とF(文字)を比較して、Fが大きいことを確認します。

+0

ありがとう、ジョー。私はそれがこれらの線に沿って何かであると考えていました。なぜなら、あなたが上記のように7E8のようなものとは対照的に1E8を選んだからです。 %sysevalf()の使用に関するヒントをありがとう。私はそれがこのような状況で必要になるとは思わなかった。 – timmyb357

+2

また、 '%sysevalf()'は日付リテラルを使用できることに注意してください。 '%if%sysevalf(&mydate> '01jan2017'd)...' – Tom