2017年6月22日木曜日

INPUT関数の落とし穴


input関数で文字値を数値に変換する際に間違いやすいところ。


Q. 下のプログラムを動かすと、変数Bはどんな値になるでしょうか?
data DT1;
   length A $10.;
   A ="10.2"; output;
   A ="25"  ; output;
run;

 A 
  10.2 
  25

data DT2;
   set DT1;
   B = input(A, 16.2);
run;

 A 
B
  10.2  
  ?  
  25
  ? 





答え.
 A 
B
  10.2  
  10.2  
  25
  0.25  

小数はそのまま数値化されますが、
整数は、小数になってしまいます。


これは、input関数に指定しているインフォーマットが影響しています。
今回の例では「input(A, 16.2)」なので2桁シフトして「25」から「0.25」になります。

「25」のまま数値化されるのかな、と思いやすいところです。

今回の場合、「input(A, 16.)」とか「input(A, best16.)」とか、データに応じた長さのインフォーマットを指定すればそのままの値「25」で数値化できます。



以下にもう少し例をあげておきます。

input(A, 16.1)
"10.2 " →  10.2
"25"     →  2.5

input(A, 16.3)
"10.2"  →  10.2
"25"     →  0.025

なんでそんな変換しちゃうんだよ!ってなると思いますが、インフォーマットの性質上のもので、そういうものって思うしかないです。


0 件のコメント:

コメントを投稿