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

【SAS中如何保留数字的有效位数()】我们先来看一下百科上有效位数的定义:
SAS中如何保留数字的有效位数()
文章图片
有效位数的定义 下面分享2种有效位数的算法。
SAS中如何保留数字的有效位数()
文章图片
方法1代码 SAS中如何保留数字的有效位数()
文章图片
方法1结果 方法1是SAS官方推荐方法,利用数学公式直接计算保留三位有效数字。代码精简,但是不容易理解。
介绍一下代码中的INT函数,SAS文档的说明是:Returns the integer value, fuzzed to avoid unexpected floating-point results,作用就是选取数字的整数部分。这里有一个注意点,如果这个数字是正数,INT函数值与FLOOR的函数值是相同的;如果数字是负数,与CEIL函数值是相同的。这个很好理解,对于正数取整,数值是往变小的;对于负数取整,数值是变大的。
SAS中如何保留数字的有效位数()
文章图片
方法2代码 SAS中如何保留数字的有效位数()
文章图片
方法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.999999then 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;

    推荐阅读