似乎我有SAS PROC FORMAT的舍入问题

Ste*_*eve 2 sas

似乎我有SAS PROC FORMAT的舍入问题.代码如下:

proc格式; value testf -1.85E-13--1.85E-13 ='negative'0-0 ='zero'; 跑;

数据测试; 输入数字best32.; 牌; 0; 跑;

数据测试2; 设定测试; 格式varlabel $ 50.​​; varlabel = put(number,testf.); 跑;

代码很简单:首先,创建一个格式,有两个选项,一个负数实际上接近零,零本身.其次,创建数据集测试,使用单个观察,其数字变量等于0.第三,创建具有应用格式的另一个数据集.我希望看到test2的number = 0和varlabel ='zero',但实际上我看到test2的number = 0和varlabel ='negative'.任何人都知道为什么以及如何解决这个问题?非常感谢任何建议/帮助.

小智 5

这是一个浮点精度问题.在测试浮点值是否相等时,SAS使用1e-12的"模糊"值(默认情况下).如果abs(ab)<1e-12,则表达式a = b的计算结果为真.在你的情况下,1.85e-13足够接近于零,SAS将给它"负面"格式(为什么它总是分配这个,而不是'零'我不知道).

解决此问题的一种方法是降低SAS与您的格式关联的模糊值:

proc format; 
  value testf (fuzz=1E-13) -1.85E-13--1.85E-13 = 'negative' 0-0 = 'zero'; 
run;
Run Code Online (Sandbox Code Playgroud)

此格式指定预期的varlabel"零".

如果这类事情对您来说是一个实际问题,您可能需要仔细考虑代码中潜在的数字精度问题,因为它们能够在错误的环境中生成一些令人讨厌且难以发现的错误.

此链接提供了有关SAS中数字表示问题的一些信息,这可能会有所帮助.