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_var1
和parent_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:
中找到
我是 运行 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_var1
和parent_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:
中找到