2014-01-28 31 views
2

为什么以下内容不能产生期望的结果?SAS以增量形式循环运行

data data1; 

do a = 0.0 to 1.0 by 0.1; 
    do b = 0.0 to 1.0 by 0.1; 
     do c = 0.0 to 1.0 by 0.1; 
      do d = 0.0 to 1.0 by 0.1; 
       if (a+b+c+d)=1 then output; 
      end; 
     end; 
    end; 
end; 
format a b c d 4.1; 
run; 
+0

'想要的结果'是什么? – Joe

+0

我的歉意。期望的结果是具有记录的数据集,其中(a + b + c + d)= 1。例如,a = 0,b = 0,c = 0和d = 1不在数据集中。 – user3245869

回答

1

我不是很熟悉SAS,但总体上,当你有号码,如0.1,它在二进制文件的表示。由于.1不能完全用二进制表示,所以数学方程并不总是完全相加。例如,在浮点运算中,0.1乘以10不等于1.0。通常,在使用浮点时不要使用相等性。

参见http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

+0

谢谢韩。你对我的错误是正确的。 – user3245869

1

号码在SAS被存储在二进制(因为它们是在大多数计算应用),并且常常不能精确地表示相应的十进制数。就像0.33333333!=(1/3)一样,许多1/10也不代表它们的精确十进制值。

data data1; 

do a = 0.0 to 1.0 by 0.1; 
    do b = 0.0 to 1.0 by 0.1; 
     do c = 0.0 to 1.0 by 0.1; 
      do d = 0.0 to 1.0 by 0.1; 
       if round(a+b+c+d,.1)=1 then output; 
      end; 
     end; 
    end; 
end; 
format a b c d 4.1; 
run; 

舍入解决了这个问题。

有关更多信息,您可以阅读this SAS technical paper

+0

谢谢乔。在我使用SAS的9年中,我从未遇到过这种情况。 – user3245869