问题描述
有人知道为什么“ numero”中存储的数字与我放入let中的数字不同吗?
我使用SAS企业指南7.1。
这是我的程序:
?
还有日志:
%let ident = 4644968792486317489 ;
data _null_ ;
numero= put(&ident.,z19.);
call symputx('numero',numero);
run;
%put &numero. ;
预先感谢!
解决方法
SAS将数字存储为8字节浮点值。因此,可以完全存储(或实际上完全没有间隙)的最大整数有一个限制。他们甚至发布了table with the maximum value。
还有一个可用于确定最大值的函数。
3 %put %sysfunc(constant(exactint),comma23.);
9,007,199,254,740,992
看起来您的“数字”实际上是一个标识符。因此,将其存储为字符开始就不会出现这些问题。
data want;
length numero $19;
numero = "&ident";
numero = translate(right(numero),'0',' ');
run;
,
使用SAS MD5
函数使字符串匿名。别忘了MACRO实际上只是文本处理。
%let ident = 4644968792486317489 ;
%let numero = %sysfunc(MD5(&ident));
或在数据步骤
中data ... ;
numero = MD5("&ident");
在某些情况下,您可能会将单调序列值与身份值相关联。
%let ident = 4644968792486317489 ;
%if not %symexist(i&ident) %then %do;
%let i&ident = %sysfunc(monotonic());
%put new serial;
%end;
%put i&ident=&&i&ident;
----- LOG -----
i4644968792486317489=1