最近看到很多人在做有效数字的程序。SAS这样的软件居然没有提供有效数字的函数,实在是有点不合理。那么我也跟风写一个有效数字的程序。
1、data aaa;
2、ornum=12936;
3、efnum=0;
4、length ornumc $200.;
5、if int(ornum)^=ornum then ornumc=put(ornum,best.-l);
6、else ornumc=cats(put(ornum,best.),'.');
7、if efnum <=0 then do;put 'Error:!!!';stop;end;
8、dot=index(strip(ornumc),'.');
9、efb=prxmatch('/[1-9]/',strip(ornumc));
10、efe=efb+efnum;
11、if efb < dot <= efe then efe=efe+1;
12、if efe > dot > 1 then effectnumc=putn(ornum,cats('30.',efe-dot-1,'-l'));
13、else if dot > 1 then effectnumc=put(round(ornum,10**(dot-1-efnum)),best.-l);
14、effectnum=input(effectnumc,best.);
15、run;
我们按行解释代码:
1、没啥说的。
2、ornum原始数字,要取近似值的那个数。
3、efnum是保留的位数。
4、为ornumc设定长度,他是原始数值的字符型。有效数字的基本思路是,先把数字变成字符型,然后找到要保留的那几个数字,然后确定这几个数字的位置,找到实际上相当于保留多少位小数。
5-6、生成变量ornumc,并在后面补上小数点。因为小数点位置是后面重要的计算依据。
7、这是防止输入数据不符合要求的语句。
8-10、变量dot是小数点的位置,efb是有效数字的起始位置,efe是有效数字的结束位置。因为估算要看保留位置后的一位,结束位置要比实际保留的位数多1,所以不需要减1。
11、要防止有效数字中间有小数点的情况,这种情况小数点占一位,所以要加上1,修正小数点的影响。
12、保留小数位要分两种情况考虑,一种是有小数部分,一种是没有小数部分。当第一种情况时,有效数字的结束位置比小数点位置大(小数点位置一定大于1),也就是符合条件 efe > dot > 1 ,此时,我们把format的长度定为一个比较大的长度——30,保留小数位应该是结束位置和小数点位置的差。减1是因为结束位置包括用来估算的最后一位。
13、第二种情况没有小数位,此时结束位置比小数点小(else if dot > 1),此时需要计算round函数的第二个参数。先求出精确的位数(dot-1-efnum),然后把他作为10的指数,就可以得到round的参数了。
14、把数值型转成字符型。
15、结束。