楼主: xiaoqiu917
3024 10

[学习分享] 【求教】关于put的问题 [推广有奖]

  • 0关注
  • 0粉丝

讲师

29%

还不是VIP/贵宾

-

威望
0
论坛币
2089 个
通用积分
6.6000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
229910 点
帖子
204
精华
0
在线时间
569 小时
注册时间
2006-8-3
最后登录
2025-10-14

楼主
xiaoqiu917 发表于 2011-7-29 11:42:27 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
正在学习sas,做了这么一个计算:
64   data a;
65   x=substr(put(123456789012345678,best18.),1);
66   put x=;
67   run;

x=123456789012345680
结果出乎意料,不知道怎么回事,望各位达人赐教

还有,如果不用put先转为文本,直接在substr里面用数字,超过12位会被转为科学计数法表示,有没有什么办法不转,比如上面的x,如果substr(123456789012345678,6,4)能得到6789
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:put SUBSTR 科学计数法 subs Best 求教 put

回帖推荐

pobel 发表于4楼  查看完整内容

下面的方法可以不用put函数 data a; length num_c $20; num=123456789012345678; num_c=num; x=substr(left(num_c),6,4); put x=; run; 对于你的第一个问题,也是由substr()函数规则所致。substr函数有三个参数,如果省略第三个参数,则sas将取出第二个参数值(此例中是1)开始的所有剩余字符。 希望表达清楚了。

本帖被以下文库推荐

沙发
pobel 在职认证  发表于 2011-7-29 17:47:22
这个不是put的问题。
substr函数是对字符串操作的,当他作用与数值型数据时,会将数值型自动转换成字符型(best.).
所以此例中如果要得到“6789”, 应该进行显示转换(put函数)

data a;
   x=substr(put(123456789012345678,best18.),6,4);
   put x=;
run;
和谐拯救危机

藤椅
xiaoqiu917 发表于 2011-8-1 10:14:47
pobel 发表于 2011-7-29 17:47
这个不是put的问题。
substr函数是对字符串操作的,当他作用与数值型数据时,会将数值型自动转换成字符型( ...
呵呵,先感谢你的回答(你是对我第二个问题做了解答吧)。不用put做转换的话,其实sas会自己转,但是会转为科学计数法表示的,我想知道能否不用put的话,是否有什么办法不转为科学计数法表示

板凳
pobel 在职认证  发表于 2011-8-1 13:40:45
xiaoqiu917 发表于 2011-8-1 10:14
呵呵,先感谢你的回答(你是对我第二个问题做了解答吧)。不用put做转换的话,其实sas会自己转,但是会 ...
下面的方法可以不用put函数

data a;
  length num_c $20;
  num=123456789012345678;
  num_c=num;
   x=substr(left(num_c),6,4);
   put x=;
run;


对于你的第一个问题,也是由substr()函数规则所致。substr函数有三个参数,如果省略第三个参数,则sas将取出第二个参数值(此例中是1)开始的所有剩余字符。

希望表达清楚了。
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

和谐拯救危机

报纸
guodong1986718 发表于 2011-8-2 10:48:38
我试了一下pobel的程序,结果出来的也是123456789012345680. 所以我觉得应该是数值型变量储存位数的限制吧。我改变了一下位数,发现:
1. 超过16位后,数据存贮出现误差
2. 16位之后的数据不按照原来数值存贮,而是以8的倍数的临近值存储

地板
xiaoqiu917 发表于 2011-8-4 16:27:46
guodong1986718 发表于 2011-8-2 10:48
我试了一下pobel的程序,结果出来的也是123456789012345680. 所以我觉得应该是数值型变量储存位数的限制吧。 ...
是的,我也发现小于等于16位时没问题,郁闷啊。有个标准解答就好了。
另外,谢谢上面的几位兄弟,看来是不转文本是解决不掉第二个问题了

7
pobel 在职认证  发表于 2011-8-4 16:47:37
xiaoqiu917 发表于 2011-8-4 16:27
是的,我也发现小于等于16位时没问题,郁闷啊。有个标准解答就好了。
另外,谢谢上面的几位兄弟,看来是 ...
比较好奇的是,对于第二个问题,为什么不能转成文本呢?
和谐拯救危机

8
leedx 发表于 2011-8-4 17:58:02
学习啦,呵呵~~~谢谢~~~

9
jingju11 发表于 2011-8-4 20:55:26
guodong1986718 发表于 2011-8-2 10:48
我试了一下pobel的程序,结果出来的也是123456789012345680. 所以我觉得应该是数值型变量储存位数的限制吧。 ...
其实16位的存储也有问题,比如说1e16-1这个数。这种类似的浮点问题的解决有可能变得比较复杂。我想在这里的关键是这么长的数字是如何读进来的?因为浮点的局限性和电脑本身有关,不完全局限于sas这个软件。
京剧

10
suzhzh 发表于 2011-8-4 21:39:26
受教了,比较有意义。

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

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