SAS中的大数字异常

问题描述

有人知道为什么“ 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

enter image description here

还有一个可用于确定最大值的函数。

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