我有看起来像这样的数据:
ID Date1 Date2 Paid Amount A 1/25/2012 -168.48 A 1/25/2012 -59.44 A 1/25/2012 -13.18 A 1/25/2012 -8.02 A 1/25/2012 8.02 A 1/25/2012 13.18 A 1/25/2012 59.44 A 1/25/2012 168.48 A 12/28/2011 1/25/2012 50.00 A 12/28/2011 1/25/2012 61.00 Proc sql; Create table SUM as Select id, date1, date2, sum(paid_amount) as paid_amount From SUM_0 Group by id, date1, date2;
我得到这样的东西:
ID Date1 Date2 paid_amount A 1/25/2012 4.547474E-13 A 12/28/2011 1/25/2012 111.00
只是通过目测,很明显空白date1的paid_amount的总和,但2012年1月25日的date2应该为0。由于某些原因以及其他类似的设置,我得到了具有E-13值的各种总和。
正如其他人指出的那样,这是一个浮点问题。就像:
2/3 - 1/3 - 1/3 = 0
但
.6667 - .3333 - .3333 > 0
浮点数本质上是不精确的。
在中SAS,您可以通过几种不同的方式来处理。最简单的两个:
SAS
round(sum(...),0.01)
E-12
Fuzz(...)
例如:
data test; input ID $ Date1 :mmddyy10. Date2 :mmddyy10. Amount; datalines; A . 1/25/2012 -168.48 A . 1/25/2012 -59.44 A . 1/25/2012 -13.18 A . 1/25/2012 -8.02 A . 1/25/2012 8.02 A . 1/25/2012 13.18 A . 1/25/2012 59.44 A . 1/25/2012 168.48 A 12/28/2011 1/25/2012 50.00 A 12/28/2011 1/25/2012 61.00 ;;;; run; proc sql; select id, date1, date2, round(sum(amount),.01) from test group by 1,2,3; quit;