首页 > 解决方案 > SAS 数值比较的奇怪行为;精度问题?

问题描述

我在 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...)

如果不是很明显,问题是我想要低于0.02 的数字,但看起来很像我的数字0.02。

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

有人可以解释这里可能发生的事情吗?是否有一些我看不到的隐藏精度?

标签: sasprecision

解决方案


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;

推荐阅读