前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAS-保留有效数字的实现方法

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

作者头像
Setup
发布2021-03-11 14:47:31
3.5K1
发布2021-03-11 14:47:31
举报

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

自定义函数

在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;

示例

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SAS程序分享号号号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档