美好的一天,
我遇到了这个问题,我在数据库中编写了一些数字,这些数字应该在SAS中具有值0.1
,但由于某些奇怪的原因在SQL数据库中显示为0.09
。当我手动检查数据集时,它以 12.2 的格式显示0.10
。
所以我所做的就是检查这些值是否实际为0.1或略低于此值:
data _checking;
set publish_data;
if value < 0.1;
dummy = value*10000000;
run;
看来观察次数满足第一个条件。好的......这就解释了为什么值为0.09。舍入问题。
但是,所有虚拟值都以整数形式出现。我试过10,100,1k,10k似乎都是整数。 (1,10,100 ......)
下一步我尝试:
data _checking2;
set _checking;
if dummy<10; /*Depending on the factorial*/
run;
这是一致的。 Dummy保留的值略低于显示的值&#39;。
我通过round(value,.1);
问题:
如何观察存储在数据集中的实际值? (特别是如果&#39;稍微低于&#39;)
如果第一个条件if为真,那么dummy
的检查如何仍然显示整数值。 (因为在计算机中epsilon必须具有实际值)
2.b或者这只是一个显示问题?或者,SAS是否标记为“减去epsilon&#39;?
答案 0 :(得分:2)
回答1:
查看实际值的最精确和最不人性化的方法是使用HEX
格式观察基础IEEE字节。
回答2:
这些新虚拟变量的默认格式为BEST12.
,因此如果它们小于最佳值12,您将不会看到任何小的偏移量。将显示,或更确切地说,epsilon&lt; 1e-(12-日志10(X))。在这种情况下,SAS格式可能被视为显示问题。
如果您的用例是“显示”的用例。 value必须是发送到远程数据库的实际值,然后您需要在填充远程表之前使用ROUND
。
data x;
x = 1/3; output;
x = 0.1 - 1e-13; output;
format x 12.2;
run;
data y;
set x;
put x= x= HEX16.;
xhex = x;
format xhex hex16.;
array dummy dummy1-dummy13;
do _n_ = 1 to 13;
dummy(_n_) = x * 10**_n_;
end;
run;
proc print data=y;
run;
data z;
do p = 0 to 10;
do q = 1 to 15;
array z z1-z15;
z(q) = 10**p + 10**-q;
end; output;
end;
drop p q;
run;
==== LOG ====
x=0.33 x=3FD5555555555555
x=0.10 x=3FB9999999997D74
==== PRINT ====
Obs x xhex dummy1 dummy2 dummy3 dummy4 dummy5 dummy6 dummy7
1 0.33 3FD5555555555555 3.33333 33.3333 333.333 3333.33 33333.33 333333.33 3333333.33
2 0.10 3FB9999999997D74 1.00000 10.0000 100.000 1000.00 10000.00 100000.00 1000000.00
Obs dummy8 dummy9 dummy10 dummy11 dummy12 dummy13
1 33333333.33 333333333.33 3333333333.3 33333333333 333333333333 3.3333333E12
2 10000000.00 100000000.00 1000000000.0 10000000000 100000000000 999999999999
答案 1 :(得分:1)
32.31
或best32.
0.1-value
并查看结果。再次,使用具有大量小数位的格式。您可能没有看到dummy
变量中的值,因为epsilon非常小,并且虚拟对象仍在四舍五入以进行显示。
dummy=value*1e16
或更高。SAS中的数字是C双打,fwiw。