我們先來看一下百科上有效位數(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;