SAS-保留有效数字的实现方法

2021-03-11 14:47:31 浏览数 (1)

在日常编程中,有时会对输出的结果保留有效数字进行要求,今天来分享一下小编保留有效数字的方法。

自定义函数

在SAS中有众多函数,但是没有保留有效数字的函数,于是小编自定义了一个函数,用来保留有效数字。

代码

代码语言:javascript复制
proc fcmp outlib=work.funcs.benfunc;
  function f_getdata(inputNumeric,significantDigit) $;
  attrib inputNumericprx inputNumericprx1 inputNumericprx2  outputNumeric  outputNumeric1 length=$100;
  outputNumeric='';
  inputNumericprx=compress(inputNumeric);
  if strip(inputNumericprx)^='0' then do;
  inputNumericprx1=strip(kscan(inputNumericprx,1,'.'));
  inputNumericheader=length(compress(inputNumericprx1,'-',''));
  if inputNumericprx1 not in ('0' '-0')  then  do;
  inputNumeric1=inputNumeric/10**inputNumericheader;
  end;
  else do;
    inputNumeric1=inputNumeric;
  end;
  BinputNumericprx=compress(inputNumeric1);
  BinputNumericprx1=strip(kscan(BinputNumericprx,1,'.'));
  BinputNumericprx2=strip(kscan(BinputNumericprx,2,'.'));
  BinputNumericindex=indexc(BinputNumericprx2,'123456789');
  inputNumericformat=strip("12.")||strip(put(BinputNumericindex significantDigit-1,8.))||strip(".");
  outputNumeric=strip(putn(inputNumeric1,inputNumericformat));
  BinputNumericformat=strip("12.")||strip(put(significantDigit-length(compress(inputNumericprx1,'-','')),12.))||strip(".");
  if length(compress(inputNumericprx1,'-',''))>significantDigit-1 then outputNumeric=strip(put(input(outputNumeric,best.)*(10**inputNumericheader),12.));
  else if compress(inputNumericprx1,'-','')^='0' then  outputNumeric=strip(putn(input(outputNumeric,12.)*(10**inputNumericheader),BinputNumericformat));
  outputNumeric1=outputNumeric;
  end;
  if strip(inputNumericprx)='0'  then do;
    outputNumeric1='0';
  end;
  return(outputNumeric1);
  endsub;
run;

示例

宏程序

前面是采用自定义函数的方法来实现,当然自定义函数的方法也是小编比较推荐的,下面来看看另外一种采用宏程序的方法来实现。

代码

代码语言:javascript复制
%macro getdata(inputNumeric,significantDigit,outputNumeric);
  inputNumeric=&inputNumeric.;
  if inputNumeric ^=0 then do;
    significantDigit=&significantDigit.;
    inputNumericprx=compress(vvalue(inputNumeric));
    inputNumericprx1=strip(kscan(inputNumericprx,1,'.'));
    inputNumericheader=length(compress(inputNumericprx1,'-',''));
    if inputNumericprx1 not in ('0' '-0')  then  inputNumeric1=inputNumeric/10**inputNumericheader;
    else  inputNumeric1=inputNumeric;
    BinputNumericprx=compress(vvalue(inputNumeric1));
    BinputNumericprx1=strip(kscan(BinputNumericprx,1,'.'));
    BinputNumericprx2=strip(kscan(BinputNumericprx,2,'.'));
    BinputNumericindex=indexc(BinputNumericprx2,'123456789');
    inputNumericformat=strip("12.")||strip(put(BinputNumericindex significantDigit-1,12.))||strip(".");
    &outputNumeric.=strip(putn(inputNumeric1,inputNumericformat));
    BinputNumericformat=strip("12.")||strip(put(significantDigit-length(compress(inputNumericprx1,'-','')),??best12.))||strip(".");
    if length(compress(inputNumericprx1,'-',''))>significantDigit-1 then  &outputNumeric.=strip(input(&outputNumeric.,??best12.)*(10**inputNumericheader));
    else if compress(inputNumericprx1,'-','')^='0' then  &outputNumeric.=strip(putn(input(&outputNumeric.,??best12.)*(10**inputNumericheader),BinputNumericformat));
    drop inputNumeric  significantDigit inputNumericprx inputNumericprx1 inputNumericheader  inputNumeric1
    BinputNumericprx BinputNumericprx1  BinputNumericprx2 BinputNumericindex inputNumericformat BinputNumericformat;
  end;
  if inputNumeric =0 then do;
    &outputNumeric.='0';
  end;
%mend;

示例

保留有效数字的方法就分享这么多了,一般情况下应该是够用了。

0 人点赞