我有一个字符格式的变量。例如,变量的值为: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
答案 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)