%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似乎一切顺利。
答案 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)
将解决问题。