SAS中如何保留數(shù)字的有效位數(shù)?

我們先來看一下百科上有效位數(shù)的定義:

有效位數(shù)的定義

下面分享2種有效位數(shù)的算法。

方法1代碼
方法1結(jié)果

方法1是SAS官方推薦方法,利用數(shù)學(xué)公式直接計算保留三位有效數(shù)字。代碼精簡,但是不容易理解。

介紹一下代碼中的INT函數(shù),SAS文檔的說明是:Returns the integer value, fuzzed to avoid unexpected floating-point results,作用就是選取數(shù)字的整數(shù)部分。這里有一個注意點(diǎn),如果這個數(shù)字是正數(shù),INT函數(shù)值與FLOOR的函數(shù)值是相同的;如果數(shù)字是負(fù)數(shù),與CEIL函數(shù)值是相同的。這個很好理解,對于正數(shù)取整,數(shù)值是往變小的;對于負(fù)數(shù)取整,數(shù)值是變大的。


方法2代碼
方法2結(jié)果

方法2是按數(shù)量級"暴力"分段,單獨(dú)put語句處理。代碼直觀,但不精簡。有一點(diǎn)需要注意,處理1000以上的數(shù)字時,需要用round函數(shù)預(yù)先加工處理,以便得到正確的有效數(shù)字位數(shù)。

附錄:

***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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容