12-27-2016 02:28 PM
I am trying to run the below code.
input a b;
if abs(b-a) le 0.05 then result='success';
The second and third row has diff1 equal to 0.05 but the result is getting value failure. First row is getting values appropriately.
Appreciate any help.
12-27-2016 03:56 PM
Round the numbers before you do a calculation.
Numbers cannot be stored exactly so the number is likely 0.050000001 or something like that.
12-27-2016 04:23 PM
As @Reeza wrote: It's about rounding and how computers store values.
Run below code and have a look at the "data two"
data one; input a b; datalines; 12.45 12.40 13.55 13.50 17.50 17.45 14.70 14.76 15.47 15.50 ; run; data two; set one; format diff1 diff2 best32.; diff1= abs(b-a); diff2=round(diff1,0.000001); if round(abs(b-a),0.0000001) le 0.05 then result='success'; else result='failure'; run;
It's not so that SAS does something wrong but it is a common trap and I'd wish for some system option which would allow us to define a max. precision so that rounding happens implicitely.
12-28-2016 03:56 AM
I totally agree with @Patrick ' s proposal about the rounding . I have met many people working with SAS failing to deal properly with number calculation.
If I may , I would add a note in the log specifying the implicit rounding (when it takes place).
@Patrick could you open a topic so the community votes for this proposal ?
12-28-2016 01:00 PM
Thanks for helping me out. With rounding the issue is resolved.
The option to define a max precision will be nice to have in such cases .