似乎我有SAS PROC FORMAT的舍入问题。代码如下:
proc格式; 价值测试 -1.85E-13--1.85E-13 ='负面' 0-0 ='零'; 运行;
数据测试; 输入数字best32。; 牌; 0 ; 运行;
数据测试2; 设定测试; 格式varlabel $ 50。; varlabel = put(number,testf。); 运行;
代码很简单:首先,创建一个格式,有两个选项,负数真正接近零,零本身。其次,创建数据集测试,使用单个观察,其数字变量等于0.第三,创建具有应用格式的另一个数据集。我希望看到test2的number = 0和varlabel ='zero',但实际上我看到test2的number = 0和varlabel ='negative'。任何人都知道为什么以及如何解决这个问题?非常感谢任何建议/帮助。
答案 0 :(得分:5)
这是一个浮点精度问题。在测试浮点值是否相等时,SAS使用“fuzz”值1e-12(默认情况下)。如果abs(a-b)<1,则表达式a = b的计算结果为真。 1E-12。在你的情况下,1.85e-13足够接近零,SAS将给它“负面”格式(为什么它总是分配这个,而不是'零'我不知道)。
处理此问题的一种方法是减少SAS与您的格式关联的模糊值:
proc format;
value testf (fuzz=1E-13) -1.85E-13--1.85E-13 = 'negative' 0-0 = 'zero';
run;
此格式指定预期的varlabel“零”。
如果这类事情对您来说是一个实际问题,您可能需要仔细考虑代码中潜在的数字精度问题,因为它们能够在错误的情况下产生一些令人讨厌且难以发现的错误
This link提供了有关SAS中数字表示问题的一些信息,这可能会有所帮助。