【问题标题】:macro error: A character operand was found in the %EVAL function or %IF condition宏错误:在 %EVAL 函数或 %IF 条件中找到字符操作数
【发布时间】:2015-05-22 09:56:11
【问题描述】:
%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 似乎一切顺利。

【问题讨论】:

  • %sysevalf(&amp;k le 0) 解决了这个问题。但是为什么-5 不需要sysevalf
  • 代码没问题。我看不出有任何理由让它不起作用。可能重启应用再试一次
  • 同意NEOmen,代码没问题

标签: macros sas sas-macro


【解决方案1】:

宏 %IF 语句隐式调用 %EVAL() 函数。 %EVAL() 理解整数(无论是正数还是负数),但不理解十进制值。当 %EVAL() 比较两个值时,如果其中一个是小数,它将进行 CHARACTER 比较。所以 %IF (3.1>10) 返回真。如果你给 %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*/

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多