BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Hanwoo
Fluorite | Level 6

안녕하세요. 

PUT 함수 사용 시 반올림과 관련해서 오류가 있는 거 같아 문의드립니다.

Hanwoo_0-1630563227285.png

다음과 같은 코드로 기술 통계량을 구한 후 put 함수를 이용해서 소수 둘째 자리까지만 남기려고 합니다.

put 함수 사용 시 ex( put(median,10.2) ) 소수 셋째 자리에서 반올림하여 소수 둘째 자리까지 값을 가지고, character 형식으로 바뀌는 것으로 알 고 있습니다.

하지만 하기의 그림과 같이 반올림이 되지 않아 SAS procedure 문에 오류가 있는 게 아닌가 싶어 문의드립니다.

Hanwoo_1-1630563464534.png

이상하게도 직접 값을 입력 후(-0.305) put문 사용 시 정상적으로 반올림이 됐습니다.

Hanwoo_3-1630563690278.png

 

  • Proc means 구문을 이용해서 구한 값(ods output summary로 뽑아낸 값)으로 PUT 함수를 이용했을 때 다음과 같이 반올림이 되지 않는 상황이 발생하는 거 같습니다(이러한 상황은 값들이 0.305, 13.965 등 반올림하려고 하는 자리가 5일 때 발생했습니다.)
  • 이러한 사항들이 오류인 것인지요? 아니면 제가 놓치고 있는 부분이 있는지요?
1 ACCEPTED SOLUTION

Accepted Solutions
Chulgyu1
SAS Employee

@Hanwoo 문의 하신 내용에 대해 간략하게 답변드립니다.

 

1. put 함수 사용 시에 반올림 기능이 내장되어 있는 것이 맞나요?  아니면 반올림이 아닌 다른 기능이 내장되어 있는 것인가요?

put 함수에 반올림 기능이 내장된게 아니고, put 함수에 사용된 format w.d 에 반올림 기능이 내장되어 있다고 보시면 됩니다.

 

2. 만약 put 함수에 반올림 기능이 내장되어 있다면 처음 문의드린 사항처럼 반올림이 안되는 경우가 있던데, 이러한 사항은 왜 발생하는 건가요?

w.d format에 내장된 반올림 기능은 빈번하지는 않지만 가끔씩 제대로 작동하지 않는 경우가 있다고 합니다.

이는 컴퓨터 메모리에 숫자를 저장하는 방식에서 비롯되는건데, 해결은 되지 않는 것 같습니다.

아마 PROC SUMMARY에 의해 생성된 데이터셋에 저장된 median 값은 소숫점 이하 자리수가 많은 숫자로 저장될 것이고,

숫자를 할당문에서 직접 대입하면 소숫점 이하 자리수가 입력된 대로 저장되어서 결과가 다르게 나올 수 있다고 보시면 될 것 같습니다.

workaround로 round 함수를 사용하시면 동일할 결과를 얻으실 수 있으시니 참고해서 사용하시면 되겠습니다.

 

View solution in original post

3 REPLIES 3
AmeeKang
Quartz | Level 8

안녕하세요
Put함수는 : 숫자유형 변수(numeric variable) > 문자유형 변수(character variable)로 바꾸는 함수입니다.

round 함수가 반올림하는 변수입니다.

 

Ex)

x = 91.667

소수점 1째 자리에서 반올림 : x1 = round(x,1) = 92

소수점 2째 자리에서 반올림 : x2 = round(x,0.1) = 91.7

소수점 3째 자리에서 반올림 : x3 = rounnd(X,0.01) = 91.67

 

 

Hanwoo
Fluorite | Level 6

안녕하세요. 답변 감사드립니다. 

 

다만 아직까지 궁금한 점이 있어 문의드립니다.

 

put 함수는 숫자유형 변수(numeric variable) > 문자유형 변수(character variable)로 바꾸는 함수이지만, 실제로 사용 시 반올림이 된 상태로 결과가 나왔습니다. 

 

Ex)

x = 91.667

put_x1 = put(x,10.1) = 91.7

put_x2 = put(x,10.2) = 91.67

 

그래서 저는 put 함수 사용시 round 함수(반올림) 기능이 내장되어 있다고 생각하였습니다.

여기서 궁금한 점들은 다음과 같습니다. 

 

1. put 함수 사용 시에 반올림 기능이 내장되어 있는 것이 맞나요?  아니면 반올림이 아닌 다른 기능이 내장되어 있는 것인가요?

 

2. 만약 put 함수에 반올림 기능이 내장되어 있다면 처음 문의드린 사항처럼 반올림이 안되는 경우가 있던데, 이러한 사항은 왜 발생하는 건가요?

 

좋은 하루 보내시길 바랍니다. 감사합니다.

 

Chulgyu1
SAS Employee

@Hanwoo 문의 하신 내용에 대해 간략하게 답변드립니다.

 

1. put 함수 사용 시에 반올림 기능이 내장되어 있는 것이 맞나요?  아니면 반올림이 아닌 다른 기능이 내장되어 있는 것인가요?

put 함수에 반올림 기능이 내장된게 아니고, put 함수에 사용된 format w.d 에 반올림 기능이 내장되어 있다고 보시면 됩니다.

 

2. 만약 put 함수에 반올림 기능이 내장되어 있다면 처음 문의드린 사항처럼 반올림이 안되는 경우가 있던데, 이러한 사항은 왜 발생하는 건가요?

w.d format에 내장된 반올림 기능은 빈번하지는 않지만 가끔씩 제대로 작동하지 않는 경우가 있다고 합니다.

이는 컴퓨터 메모리에 숫자를 저장하는 방식에서 비롯되는건데, 해결은 되지 않는 것 같습니다.

아마 PROC SUMMARY에 의해 생성된 데이터셋에 저장된 median 값은 소숫점 이하 자리수가 많은 숫자로 저장될 것이고,

숫자를 할당문에서 직접 대입하면 소숫점 이하 자리수가 입력된 대로 저장되어서 결과가 다르게 나올 수 있다고 보시면 될 것 같습니다.

workaround로 round 함수를 사용하시면 동일할 결과를 얻으실 수 있으시니 참고해서 사용하시면 되겠습니다.