BookmarkSubscribeRSS Feed
Olivier
Pyrite | Level 9
Hello all.
I'm a long-time friend of formats, and I was puzzled when this strange thing appened to one of my clients. I can't figure any explanation to this ; maybe one of you would have an idea ?
Question is sent to Tech Support in France, but no answer yet.

The thing is :
1) I create to different formats, which only differ in an extra interval for one of them ;
2) I compute a value which is approximately -50 (due to roundings, the true value is not exactly -50 but I don't think this is really the point, or at least not the ONLY problem)
3) I use these two formats on the same value, and in spite of the same definition of intervals for value -50 in both formats, I end up with two DIFFERENT values !

Amazing, isn't it ?

Here is my sample program :

proc format ;
value pcta -80-<-50 = "A "
-50-<-10 = "B "
-10-high= "X "
;
value pctb -80-<-50 = "A "
-50-<-10 = "B "
;
run;
data test;
x = 3.4-2.8;
y = 2.9-2.6;
pcta = (y-x)/x*100;
run;
proc sql ;
select PUT(pctA,pcta.), PUT(pctA,pctb.)
from test
;
quit ;

Any ideas welcome !
Regards
Olivier
2 REPLIES 2
Cynthia_sas
SAS Super FREQ
Hi, Olivier:
No answers. Just more questions. The same thing happens when you use a format OUTSIDE of the PUT statement as shown below. Interestingly enough, when I take the subtraction out of the mix, then the format works as expected.
cynthia
*** another example;[pre]
data test;
try=1;
x = 3.4-2.8;
y = 2.9-2.6;
pcta = (y-x)/x*100;
output;

try=2;
x = 3.4000-2.8000;
y = 2.9000 - 2.6000;
pcta = (y-x)/x*100;
output;

try=3;
x = 3.4000-2.8000;
y = 2.9000 - 2.6000;
pcta = (y-x)/x*100.00;
output;

try=4;
x = .60000000;
y = .30000000;
pcta = (y-x)/x*100;
output;

try=5;
x = .488888;
y = .244444;
pcta = (y-x)/x*100;
output;

try=6;
x = .5;
y = .25;
pcta = (y-x)/x*100;
output;

try=7;
x = .750000;
y = .350000;
pcta = (y-x)/x*100;
output;

try=8;
x = .75000;
y = .37500;
pcta = (y-x)/x*100;
output;

try=9;
x = .75000;
y = .37499;
pcta = (y-x)/x*100;
output;

try=10;
x = .75000;
y = .37511;
pcta = (y-x)/x*100;
output;
run;

proc report data=test nowd;
column try x y pcta pcta=two pcta=three;
define pcta / display 'Unformatted pcta' width=12;
define two / display format=pcta. 'with pcta fmt' width=5;
define three / display format=pctb. 'with pctb fmt' width=5;
run;
[/pre]
Olivier
Pyrite | Level 9
Cynthia, I'm glad that it is not a silly question and that it can also puzzle the SAS people. Anyway, you managed to add a Report procedure in the problem, this sounds like you're report-addicted !!! 🙂

Anyway, something weirder, since it doesn't seem to be related in any way, yet solves the problem :

proc format ;
value pcta (NOTSORTED)
-80-<-50 = "A "
-50-<-10 = "B "
-10-high= "X "
;
value pctb -80-<-50 = "A "
-50-<-10 = "B "
;
run;

Adding the NOTSORTED option makes both formats work the same way. But it doesn't sound more logical to me anyway.

I already solved the problem adding a FUZZ option to the format. What I want is to understand what's happening here, and how adding intervals can disturb the way a formats handle the same value !

Have a nice weekend (time to flee from work, here in France) !
Olivier

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 2 replies
  • 634 views
  • 0 likes
  • 2 in conversation