宏错误:在%EVAL函数或%IF条件中找到了字符操作数

时间:2015-05-22 09:56:11

标签: macros sas sas-macro

%macro test(k);

%if &k le 0 %then %put < 0 ;
%else %put > 0;
%mend test;
%test(-5); 
%test(3.1);

%test(-3.1);会产生错误

ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: 
       &k le 0 

我不知道为什么这个简单的价值比较会导致错误。起初我猜是因为.。但输入3.1似乎一切顺利。

2 个答案:

答案 0 :(得分:3)

宏%IF语句隐式调用%EVAL()函数。 %EVAL()可以理解整数(无论是正数还是负数),但不能理解十进制值。当%EVAL()比较两个值时,如果其中一个是小数,它将进行CHARACTER比较。所以%IF(3.1> 10)返回true。如果给%EVAL一个前面有负号的小数(-3.1),它会出错,因为它认为3.1是字符而不是数字,所以 - 符号必须是减法运算符,然后你试图减去字符值。以下是使用%eval()播放的一些示例。

%put %eval(10   > 2) ;   /*true: numeric comparison*/
%put %eval(10.1 > 2) ;   /*false: character comparison*/

%put %eval(-2   > -5 ) ; /*true: numeric comparison*/
%put %eval(2.0  > -5 ) ; /*true: character comparison*/

%put %eval(+10 > +2 ) ; /*true: numeric comparison*/
%put %eval(-10 > +2 ) ; /*false: numeric comparison*/
%put %eval(10.1 > +20 ) ; /*false: character comparison (+20 is evaluated to 20) */
%put %eval(+10.1 >+20 ) ;  /*error: %eval() cant handle +10.1*/
%put %eval(-10.1 >+20 ) ;  /*error: %eval() cant handle -10.1*/

%put %eval(-2);    /* -2 */
%put %eval(+2);    /* 2 */
%put %eval(-2.1);  /*error*/
%put %eval(+2.1);  /*error*/

答案 1 :(得分:0)

您应该使用sysevalf来使用浮点算法来计算算术和逻辑表达式。正如您所指出的,%sysevalf(&k le 0)将解决问题。