/*宏功能,不改变变量名字,但将数值变量变成字符变量,因为根据需要,只有字符变量才能满足要求
var为要修改的变量,n为小数点后保留几位有效数字*/
%macro validnum(var=,n=);
position=indexc(left(&var),"123456789");
if position<=3 then z=round(&var,1/(10**&n));
else z=round(&var,1/10**(position+&n-3));
if 10**(&n-2)<scan(z,2,".")+0<10**(&n-1) then var=strip(z)||"0"; /*解决末尾恰好是零被省略的问题*/
else if 10**(&n-2)>=scan(z,2,".")+0 then var=strip(z)||"00";
else var=left(z);
drop &var;
rename var=&var;
drop position z;
%mend;
%let d=3;
data two;
set one;
if int(x) ne 0 then
x1 = round(x, 10**(-&d));
else x1 = round(x, 10**(-1*(abs(int(log10(abs(x))))+&d)));
run;
proc print data=two; format x x1 15.10; title 'two'; run;