我们先来看一下百科上有效位数的定义:
下面分享2种有效位数的算法。
方法1是SAS官方推荐方法,利用数学公式直接计算保留三位有效数字。代码精简,但是不容易理解。
介绍一下代码中的INT
函数,SAS文档的说明是:Returns the integer value, fuzzed to avoid unexpected floating-point results,作用就是选取数字的整数部分。这里有一个注意点,如果这个数字是正数,INT
函数值与FLOOR
的函数值是相同的;如果数字是负数,与CEIL
函数值是相同的。这个很好理解,对于正数取整,数值是往变小的;对于负数取整,数值是变大的。
方法2是按数量级"暴力"分段,单独put语句处理。代码直观,但不精简。有一点需要注意,处理1000以上的数字时,需要用round函数预先加工处理,以便得到正确的有效数字位数。
附录:
***1***;
data one;
length _3sigdigit $8;
input x;
if x=0 then _3sigdigit="0";
else do;
if int(x) ne 0 then _3sigdigit=strip(put(round(x,10**(int(log10(abs(x)))-2)),??best.));
else _3sigdigit=strip(put(round(x,10**(-1*(abs(int(log10(abs(x))))+3))),??best.));
end;
datalines;
0
0.0008965
0.0051368
0.023489
0.9742
1.8275
35.479
735.004
3149.0865
;
run;
***2***;
data two;
length avalc $8;
input aval;
if aval = 0 then avalc="0";
else if aval<0.0009999 then avalc = strip(put(aval,8.6));
else if aval<0.0099999 then avalc = strip(put(aval,8.5));
else if aval<0.0999999 then avalc = strip(put(aval,8.4));
else if aval<0.9999999 then avalc = strip(put(aval,8.3));
else if aval<9.999999 then avalc = strip(put(aval,8.2));
else if aval<99.9999999 then avalc = strip(put(aval,8.1));
else if aval<999.9999999 then avalc = strip(put(aval,8.0));
else if aval<9999.9999999 then avalc = strip(put(round(aval,10),8.0));
datalines;
0
0.0008965
0.0051368
0.023489
0.9742
1.8275
35.479
735.004
3149.0865
;
run;