SAS 数字比较的奇怪行为;精度问题?

Odd behavior with SAS numeric comparison; precision issue?

我是 运行 SAS 中的一个简单不等式过滤器,如下所示:

data my_data;
    set my_data;
    my_var = sum(parent_var1, -parent_var2)
run;

proc sql;
    select my_var format=32.32
    from my_data
    where my_var < 0.02;
quit;

我得到以下结果:

my_var
.0200000000000000000000000000000
.0200000000000000000000000000000
.0200000000000000000000000000000
(etc...)

如果不是很明显,问题是我想要下面.02 的数字,但它看起来很像我的数字.02.

根据我查看数据集时列出的属性,my_var的长度设置为8。parent_var1parent_var2都是十进制数,长度为8,格式为8.5 .

谁能解释一下这里可能发生了什么?是否有一些我看不到的隐藏精度?

SAS 只有数字的浮点二进制数据类型。没有类型可以代替十进制算术。所以您的值可能略小于 0.02。

您可能希望将您的值四舍五入到固定的小数位数,例如四或五。在您的数据上尝试此代码并检查您是否仍然看到那些 0.02 值。

data my_data;
   set my_data;
   my_var = round(sum(parent_var1, -parent_var2),0.00001) ;
   if my_var < 0.02 then put (my_var paren_var1 parent_var2) (= best32.8) ;
run;

如果参数足够接近,您可以尝试使用 FUZZ function 最接近的整数 returns。但是,您需要将 where 表达式的两边都乘以 100 才能使其正常工作。

proc sql;
    select my_var format=32.32
    from my_data
    where fuzz(my_var * 100) < 2;
quit;

有关浮点类型发生这种情况的原因的更多信息,您可以在以下 papers/presentations:

中找到