BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
BertieDark
Calcite | Level 5

I have noticed a discrepancy when applying a format to a mean where the last digit is 5. In the example below two means are calculated, both giving a result of exactly 90.55. However when the results are formatted to 6.1, one mean shows as 90.5 and the other as 90.6.

 

data problem;
	input gp x;
	datalines;
	1 92.8
	1 93.4
	1 94.6
	1 81.4
	2 90.55
	2 90.55
	2 90.55
	2 90.55
	;
run;
proc means data=problem mean;
	by gp;
	var x;
	output out=means mean=x;
run;
proc print data=means; 
	format x 6.1;
run;

The output from this code is as follows:

--------------------------------------------- gp=1 ---------------------------------------------

                                      The MEANS Procedure

                                     Analysis Variable : x

                                                  Mean
                                            90.5500000

--------------------------------------------- gp=2 ---------------------------------------------

                                     Analysis Variable : x

                                                  Mean
                                            90.5500000

                            Obs    gp    _TYPE_    _FREQ_         x

                             1      1       0         4        90.5
                             2      2       0         4        90.6

Can anyone explain this please?

 

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
PaigeMiller
Diamond | Level 26

This is due to rounding error, which happens when computing means and when changing the number of decimal places. This is usually unavoidable when working with fractions/decimals that are not a negative power of 2, or multiples thereof.

 

If you change the format of X to best32., you will see 

 

gp                                   x

 1                    90.5499999999999
 2                               90.55

 

and so to round to one decimal place, x for gp=1 is 90.5, while for gp=2 rounded to one decimal place x is 90.6.

 

If you really don't want this to happen, and you need x to one decimal place without this rounding error, you can first run this and then to one decimal place you get the same answer.

 

data means;
    set means;
    x=round(x,0.01);
run; 

 

--
Paige Miller

View solution in original post

2 REPLIES 2
PaigeMiller
Diamond | Level 26

This is due to rounding error, which happens when computing means and when changing the number of decimal places. This is usually unavoidable when working with fractions/decimals that are not a negative power of 2, or multiples thereof.

 

If you change the format of X to best32., you will see 

 

gp                                   x

 1                    90.5499999999999
 2                               90.55

 

and so to round to one decimal place, x for gp=1 is 90.5, while for gp=2 rounded to one decimal place x is 90.6.

 

If you really don't want this to happen, and you need x to one decimal place without this rounding error, you can first run this and then to one decimal place you get the same answer.

 

data means;
    set means;
    x=round(x,0.01);
run; 

 

--
Paige Miller
BertieDark
Calcite | Level 5

Thank you @PaigeMiller 

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

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
  • 2 replies
  • 778 views
  • 1 like
  • 2 in conversation