楼主: Imasasor
15406 10

怎么保留有效数字? [推广有奖]

  • 1关注
  • 64粉丝

VIP

已卖:215份资源

学科带头人

33%

还不是VIP/贵宾

-

TA的文库  其他...

超哥喜欢的文章

威望
1
论坛币
47033 个
通用积分
3.1376
学术水平
238 点
热心指数
246 点
信用等级
231 点
经验
37102 点
帖子
849
精华
3
在线时间
2235 小时
注册时间
2012-7-4
最后登录
2024-10-10

初级学术勋章 初级热心勋章 初级信用勋章 中级热心勋章 中级学术勋章

楼主
Imasasor 发表于 2013-6-22 18:25:55 |AI写论文
488论坛币
sas的四舍五入有round,那么有效数字有没有相关函数?
或者有没有曲折解决办法
例如要保留三位有效数字
0.003456
变成0.00346
0.87
变成0.870
等等
如何保留三位有效数字?

其实呢,我不是想保留有效数字,我是想小数点后保留三位有效数字,即从左边第一个不是零的数字开始取三位,并且是四舍五入形式地取
假如一个值是14.32456,我需要14.325。这样子的


关键词:ROUND 四舍五入 sas的 解决办法 相关函数 小数点 如何

本帖被以下文库推荐

欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

沙发
hopewell 发表于 2013-6-22 18:25:56
  1. proc fcmp outlib=work.funcs.benfunc;
  2.     function getdp(inputNumeric,significantDigit);
  3.         attrib prx length=$100;
  4.         _significantDigit=max(significantDigit-1,0);
  5.         prx=cats('s/\d+\.(0{0,3}[1-9]\d{',_significantDigit,'})\d*/$1/');
  6.         digitPart=prxchange(prx,1,put(inputNumeric,best.));
  7.         outputNumeric=input(putn(inputNumeric,cats('8.',length(strip(digitPart)))),best.);
  8.         return(outputNumeric);
  9.     endsub;
  10. run;

  11. options cmplib=work.funcs;
  12. data raw;
  13.     input x;
  14.     y=getdp(x,3);
  15. datalines;
  16. 0.438484941
  17. 0.464599606
  18. 9.495493169
  19. 9.942254617
  20. 0.001569698
  21. 0.01562698
  22. 3.762151003
  23. 1.399460795
  24. 0.20005887
  25. 10.98864735
  26. 3.985306473
  27. 9.852477223
  28. 2.979635042
  29. ;
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 100 热心帮助其他会员
playmore + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 100  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

观钓颇逾垂钓趣 种花何问看花谁

藤椅
zhengbo8 发表于 2013-6-22 20:23:23
完美解决。

  1. data _NULL_;

  2.         a=0.003456;
  3.         b=0.87;
  4.         c=14.32456;

  5.         a=input(put(a,d7.5),d7.5);

  6.         format b 5.3;
  7.         b=input(put(b,d5.3),d5.3);

  8.         c=input(put(c,d6.4),d6.4);

  9.         put a= b= c=;
  10. run;
复制代码


先变字符,再转数字,从根本上改变为所要的结果,保留有效数字。
在SAS自动转化时,会自动四舍五入。
若只用FORMAT,只是改变输出格式,而没有改变数值本身,虽然看不出差别。


板凳
playmore 发表于 2013-6-22 20:37:00
你说的意思不是像下面所示的那样吧?

%let a=0.03244214678;
%let b=%SYSFUNC(ROUND(&a,0.00001));
%put &b;

用round函数加参数可以确定保留到小数点后几位,但不能确定有效数字

你所说的保留有效数字的方法,估计得用其他函数来解决了,不知道SAS里有没有
我先查查看
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

报纸
Imasasor 发表于 2013-6-22 20:37:33
data x;
input x;
cards;
0.438484941
0.464599606
9.495493169
9.942254617
0.001569698
0.01562698
3.762151003
1.399460795
0.20005887
10.98864735
3.985306473
9.852477223
2.979635042
;
run;

/*宏功能,不改变变量名字,但将数值变量变成字符变量,因为根据需要,只有字符变量才能满足要求
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;

data c;
set x;
%validnum(var=x,n=4);
run;

凡事都要靠自己
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

地板
playmore 发表于 2013-6-22 20:44:08
Imasasor 发表于 2013-6-22 20:37
data x;
input x;
cards;
嗯,刚在google搜,结果又搜回本坛

https://bbs.pinggu.org/thread-2124278-1-1.html

你看这个行不行,比你写的简单,
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

7
Imasasor 发表于 2013-6-22 21:07:25
playmore 发表于 2013-6-22 20:44
嗯,刚在google搜,结果又搜回本坛

https://bbs.pinggu.org/thread-2124278-1-1.html
查了一下帮助,也没看懂这个格式d7.4
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

8
zhengbo8 发表于 2013-6-22 21:32:16
Imasasor 发表于 2013-6-22 21:07
查了一下帮助,也没看懂这个格式d7.4
帮助中说这是d浮动格式。

9
yongyitian 发表于 2013-6-23 10:57:47
data one;
  input x;
datalines;
0.00001616
0.0051368
35.479
3149.0865
; run;

%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;

10
老师她摸我 发表于 2013-6-23 20:19:14
  1. %macro dec(dsnin=,dsnout=,varin=,varout=,de=);
  2. %let de1=%eval(&de-2);
  3. %let de2=%eval(&de-1);
  4. data &dsnout;
  5.     set &dsnin;
  6.     if &varin gt 0.1 then vin=strip(put(round(&varin,1/10**(&de)),best.));
  7.         else vin=strip(put(round(&varin,1/(10**(length(prxchange('s/[1-9]//',-1,scan(put(&varin,best.),2)))+&de))),best.));
  8.     if not prxmatch('/\./',vin) then do;
  9.                 &varout=strip(vin)||'.';
  10.                 do while(1);
  11.                         &varout=cats(&varout,'0');
  12.                         if length(scan(&varout,2)) eq &de then leave;
  13.                 end;
  14.         end;
  15.         else if length(scan(vin,2)) lt &de or length(prxchange('s/(.+?)([1-9]{1})(\d+)?/$3/',-1,vin)) eq &de1 then do;
  16.                 &varout=vin;
  17.                 do while(1);
  18.                         &varout=cats(&varout,'0');
  19.                         if length(prxchange('s/(.+?)([1-9]{1})(\d+)?/$3/',-1,&varout)) eq &de2 then leave;
  20.                 end;
  21.         end;
  22.         else &varout=vin;
  23.         drop vin;
  24. run;
  25. %mend;
复制代码
欢迎加入SAS群:144839730-蜗牛

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-6 08:14