BookmarkSubscribeRSS Feed
Sheeba
Lapis Lazuli | Level 10

Hi,

 

I am trying to run the below code.

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;

diff1= abs(b-a);

if abs(b-a) le 0.05 then result='success';

else result='failure';

run;

 

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.

 

Regards,

Sheeba

6 REPLIES 6
Reeza
Super User

Round the numbers before you do a calculation. 

 

Numbers cannot be stored exactly so the number is likely 0.050000001 or something like that. 

 

http://support.sas.com/documentation/cdl/en/lrcon/69852/HTML/default/viewer.htm#p0ji1unv6thm0dn1gp4t...

Sheeba
Lapis Lazuli | Level 10

Hi Reeza,

 

Thanks a lot for the details.

 

It is working as expected now

Regards,

Sheeba

Patrick
Opal | Level 21

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.

Loko
Barite | Level 11

Hello,

 

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 ?

Sheeba
Lapis Lazuli | Level 10

Hi Loko,

 

Thanks for the reply. Yes rounding resolved the issue here

 

Regards,

Sheeba

Sheeba
Lapis Lazuli | Level 10

Hi Patrick,

 

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 .

 

Thanks again,

Regards,

Sheeba

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 6 replies
  • 2254 views
  • 4 likes
  • 4 in conversation