在日常编程中,有时会对输出的结果保留有效数字进行要求,今天来分享一下小编保留有效数字的方法。
自定义函数
在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;
示例
保留有效数字的方法就分享这么多了,一般情况下应该是够用了。