SAS中文论坛

标题: 数字的精度问题 [打印本页]

作者: shiyiming    时间: 2004-5-20 15:50
标题: 数字的精度问题
我想把字符型的变量转成数字型,但是精度损失很大。如何解决啊?
[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]
作者: shiyiming    时间: 2004-5-20 17:21
又试了一段,直接用数字型变量赋值,似乎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]
作者: shiyiming    时间: 2004-5-20 17:22
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]
作者: shiyiming    时间: 2004-5-20 17:28
问题不在字符转变量换为数值变量的过程,而是在系统默认对数值变量长度的限制,默认情况下为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


因此问题的关键在于改变数值型变量长度的系统默认设置。我还未曾找到改变此设置的方法,不知哪位知道?
作者: shiyiming    时间: 2004-5-20 17:30
2楼的程序只能说是format的作用,物理存放时是不会有0.1000000这样的数出现的。

在SAS帮助中搜索 significant digits retained 即可。
作者: shiyiming    时间: 2004-5-20 17:35
我的实验结果只能到5位
作者: shiyiming    时间: 2004-5-20 17:51
SAS Support确认了
[quote:76e77]SAS only can store 16 or 17 digit numeric value depending on system.
......[/quote:76e77]
谢谢大家!
作者: shiyiming    时间: 2004-5-21 09:29
结果如下:
[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]
作者: shiyiming    时间: 2007-6-21 09:36
标题: 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 -->
作者: shiyiming    时间: 2007-6-21 10:09
标题: to helen
很遗憾,还是没有解决方案,只能按照字符来处理。
作者: shiyiming    时间: 2007-6-21 10:38
标题: Re: [求助] 数字的精度问题
郁闷啊,为此我不得不把字符型的重新赋值,几百万的数据啊。

btw, 我是你以前同事的helen wei.  <!-- s8) --><img src="{SMILIES_PATH}/icon_cool.gif" alt="8)" title="Cool" /><!-- s8) -->
作者: shiyiming    时间: 2007-6-21 10:48
标题: Re: [求助] 数字的精度问题
努力转化吧 <!-- s8) --><img src="{SMILIES_PATH}/icon_cool.gif" alt="8)" title="Cool" /><!-- s8) -->
第一个帖子我就知道老大你是谁了,我认识几个helen wei啊,肯定是老大你啊!




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2