当长度为25时,从字符转换为数字

时间:2014-08-21 22:30:10

标签: formatting sas

我有一个字符格式的变量。例如,变量的值为:112002500501002106302001,长度为25.我想将其转换为数字变量。

我正在使用标准代码:

data trial1 ;
    set trial;
    code1 = input(CODE,25);
    run;

现在该值的格式为1.120025E23

data trial1 ;
set trial;
code1 = input(CODE,25);
format code1 best25.;
run;

但我得到的结果并不准确。

我使用的是sas 9.3

2 个答案:

答案 0 :(得分:2)

所有数字在SAS中都是双倍的。来自维基百科(http://en.wikipedia.org/wiki/Double-precision_floating-point_format)"在2 ^ 52 = 4,503,599,627,370,496和2 ^ 53 = 9,007,199,254,740,992之间,可表示的数字正是整数。"

所以让我们运行一个循环来将字符串转换为数字:

data test;
format x $25. y z best32.;
x = '112002500501002106302001';
a = '9,007,199,254,740,992';
y = input(x,best32.);
put x=;
put y=;

z = 0;
do i=1 to 24;
    z = sum(z,10**(i-1)*input(substr(x,length(x)-i+1,1),best.));
    put i z= comma32.;
end;
run;

输出:

x=112002500501002106302001
y=112002500501002105389056
1 z=1
2 z=1
3 z=1
4 z=2,001
5 z=2,001
6 z=302,001
7 z=6,302,001
8 z=6,302,001
9 z=106,302,001
10 z=2,106,302,001
11 z=2,106,302,001
12 z=2,106,302,001
13 z=1,002,106,302,001
14 z=1,002,106,302,001
15 z=501,002,106,302,001
16 z=501,002,106,302,001
17 z=501,002,106,302,001
18 z=500,501,002,106,302,016
19 z=2,500,501,002,106,301,952
20 z=2,500,501,002,106,301,952
21 z=2,500,501,002,106,301,952
22 z=2,002,500,501,002,106,175,488
23 z=12,002,500,501,002,105,389,056
24 z=112,002,500,501,002,088,611,840

您会注意到17到18次迭代之间的数字会中断。这超过了阈值,双精度不能再表示精确整数(9,007,199,254,740,992)。

答案 1 :(得分:0)

SAS使用8个字节来存储数字变量。可以准确表示的整数大小有限制。请参见数字精度,例如

TS654: Numeric Precision 101

如果这是一个字符代码,最好将它留作字符变量。