sas - 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。
有人可以解释这里可能发生的事情吗?是否有一些我看不到的隐藏精度?
解决方案
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;
推荐阅读
- python - 使用单引号 ( ' ) 作为变量值
- python - FiPy 中的固定通量边界条件
- java - 多态性和继承关系
- android - 移动可观察项目时如何禁用recyclerview滚动
- spring - 具有密码授予类型的 WebClient 的 Spring Security OAuth 客户端不要求新令牌
- neural-network - 梯度下降中的 Sigmoid 导数
- jenkins - 通过 Jenkins 在 Docker 映像上运行的赛普拉斯在第一次测试中挂起
- sshj - 如何在 Java 中进行 SFTP(禁用 SSH 时)
- java - Java 时区到毫秒
- c++ - 有没有办法禁止在继承类中声明对象成员?