SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2796|回复: 11
打印 上一主题 下一主题

数字的精度问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2004-5-20 15:50:27 | 只看该作者

数字的精度问题

我想把字符型的变量转成数字型,但是精度损失很大。如何解决啊?
[code:57263]data _null_;
a='1234567890.1234567890';
b=inputn(a, 21.10);
put a=;
put b=;
run;[/code:57263]
LOG
[quote:57263]1  data _null_;
2  a='1234567890.1234567890';
3  b=inputn(a, 21.10);
4  put a=;
5  put b=;
6  run;

NOTE: Numeric values have been converted to character
      values at the places given by: (Line):(Column).
      509:13
a=1234567890.1234567890
b=1234567890.1
NOTE: DATA statement used:
      real time           0.00 seconds
      cpu time            0.00 seconds[/quote:57263]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2004-5-20 17:21:04 | 只看该作者
又试了一段,直接用数字型变量赋值,似乎SAS只支持16位的总长(包括小数点),但是HELP明明写着支持32位啊。
[code:d40ca]data _null_;
length a 8;
informat a 21.10;
format a 21.10;
a=1234567890.1234567890;
put a=;
run;[/code:d40ca]
LOG
[quote:d40ca]1  data _null_;
2  length a 8;
3  informat a 21.10;
4  format a 21.10;
5  a=1234567890.1234567890;
6  put a=;
7  run;

a=1234567890.1234500000
NOTE: DATA statement used:
      real time           0.00 seconds
      cpu time            0.00 seconds[/quote:d40ca]
HELP
[quote:d40ca]'Informat'        'Description'                        'Width Range'        'Decimal Range'        'Default Width'
w.d                reads standard numeric data        1-32                0-31[/quote:d40ca]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2004-5-20 17:22:23 | 只看该作者
Windows下,length 8的数值最高精度为15个数字。

[code:61dd6]data _null_;
   format b c d best30.;
   a = '1234567890.123456789012345678';
   b = a;
   c = scan(a,1,'.');
   d = '0.'||scan(a,2,'.');
   put a = ;
   put b = ;
   put c = ;
   put d = ;
run;[/code:61dd6]

c是SAS可以表示最高位数的小数之一。加上前面的0,一共15位。

[quote:61dd6]NOTE: 字符值已转换为数字值,位置:(行:列)。
      400:8    401:8    402:12
a=1234567890.123456789012345678
b=1234567890.12345
c=1234567890
d=0.12345678901234
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间         0.01 秒
      CPU 时间         0.01 秒
[/quote:61dd6]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2004-5-20 17:28:06 | 只看该作者
问题不在字符转变量换为数值变量的过程,而是在系统默认对数值变量长度的限制,默认情况下为12。

以上程序中如果将字符变量的总长度缩短为12,则其精度丝毫不会损失。

data _null_;
a='90.1234567890';
b=input(a, 21.11);
put a=;
put b=;
run;

31   data _null_;
32   a='90.1234567890';
33   b=input(a, 21.11);
34   put a=;
35   put b=;
36   run;

a=90.1234567890
b=90.123456789
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds


因此问题的关键在于改变数值型变量长度的系统默认设置。我还未曾找到改变此设置的方法,不知哪位知道?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2004-5-20 17:30:43 | 只看该作者
2楼的程序只能说是format的作用,物理存放时是不会有0.1000000这样的数出现的。

在SAS帮助中搜索 significant digits retained 即可。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2004-5-20 17:35:25 | 只看该作者
我的实验结果只能到5位
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2004-5-20 17:51:22 | 只看该作者
SAS Support确认了
[quote:76e77]SAS only can store 16 or 17 digit numeric value depending on system.
......[/quote:76e77]
谢谢大家!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2004-5-21 09:29:19 | 只看该作者
结果如下:
[quote:88823]1    data _null_;
2    a='1234567890.1234567890';
3    b=input(a,21.10);
4    put a=;
5    put b=21.10;
6    run;

a=1234567890.1234567890
b=1234567890.1234500000
NOTE: DATA statement used:
      real time           1.23 seconds
      cpu time            0.23 seconds

[/quote:88823]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2007-6-21 09:36:51 | 只看该作者

Re: [求助] 数字的精度问题

<!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
shiyiming 我是helen wei
我现在就遇到这个数字精度的问题了
18位字符型,但是我要转换为数值型,但是转换后系统最后几位都归零了。真的没有办法解决了么?距离你提出这个问题好几年过去了,说不定又解决方案了呢。

多谢啊
<!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2007-6-21 10:09:15 | 只看该作者

to helen

很遗憾,还是没有解决方案,只能按照字符来处理。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 07:16 , Processed in 0.087970 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表