美文网首页
SAS中如何保留数字的有效位数?

SAS中如何保留数字的有效位数?

作者: 野藤_ | 来源:发表于2020-05-02 13:59 被阅读0次

我们先来看一下百科上有效位数的定义:

有效位数的定义

下面分享2种有效位数的算法。

方法1代码 方法1结果

方法1是SAS官方推荐方法,利用数学公式直接计算保留三位有效数字。代码精简,但是不容易理解。

介绍一下代码中的INT函数,SAS文档的说明是:Returns the integer value, fuzzed to avoid unexpected floating-point results,作用就是选取数字的整数部分。这里有一个注意点,如果这个数字是正数,INT函数值与FLOOR的函数值是相同的;如果数字是负数,与CEIL函数值是相同的。这个很好理解,对于正数取整,数值是往变小的;对于负数取整,数值是变大的。


方法2代码 方法2结果

方法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;

相关文章

网友评论

      本文标题:SAS中如何保留数字的有效位数?

      本文链接:https://www.haomeiwen.com/subject/goihghtx.html