正如其他人指出的那样,这是一个浮点问题。就像:
2/3 - 1/3 - 1/3 = 0
但
.6667 - .3333 - .3333 > 0
浮点数本质上是不精确的。
在中
SAS,您可以通过几种不同的方式来处理。最简单的两个:
- 圆形的。
round(sum(...),0.01)
将其舍入到最接近的0.01,如果愿意,则可以舍入到最接近的0.000001;通常E-12
是您开始看到浮点精度问题蔓延的地方,因此任何小于10的零都可以。 - 绒毛。
Fuzz(...)
自动将接近整数的数字四舍五入到该整数。 否则 它不会四舍五入,只有接近实整数的事物成为一。
例如:
data test; input ID $ Date1 :mmddyy10. Date2 :mmddyy10. Amount; datalines;A . 1/25/2012 -168.48A . 1/25/2012 -59.44A . 1/25/2012 -13.18A . 1/25/2012 -8.02A . 1/25/2012 8.02A . 1/25/2012 13.18A . 1/25/2012 59.44A . 1/25/2012 168.48A 12/28/2011 1/25/2012 50.00A 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;



