小数点つきデータを文字列化する書式が、言語によって違い、いろいろな文化があります。
代表的な書式文字列と、それを与えた場合どんな出力なるか、を確認してみた結果が以下。
- 符号,小数点を「含む」全桁数 + 小数点以下の桁数 を指定するケース その1
FORTRAN … F6.2
例
5.50 # write(*,'(F6.2)') 5.5 55.55 # write(*,'(F6.2)') 55.55 555.55 # write(*,'(F6.2)') 555.555 ****** # write(*,'(F6.2)') 5555.55 ←桁オーバー -55.50 # write(*,'(F6.2)') -55.5 ****** # write(*,'(F6.2)') -555.5 ←桁オーバー
- 符号,小数点を「含む」全桁数 + 小数点以下の桁数 を指定するケース その2
C … %6.2f
例
5.50 # printf("%6.2fn", 5.5); 55.55 # printf("%6.2fn", 55.55); 555.55 # printf("%6.2fn", 555.555); 5555.55 # printf("%6.2fn", 5555.55); ←桁オーバー -55.50 # printf("%6.2fn", -55.5); -555.50 # printf("%6.2fn", -555.5); ←桁オーバー
- 小数点を「含まない」全桁数 + 小数点以下の桁数 を指定するケース
ORACLE … NUMBER(5,2)
例
SQL> create table NUMTEST 2 ( 3 NUM number(5,2) 4 ); 表が作成されました。 SQL> insert into NUMTEST values (5.5); 1行が作成されました。 SQL> insert into NUMTEST values (55.55); 1行が作成されました。 SQL> insert into NUMTEST values (555.555); 1行が作成されました。 SQL> insert into NUMTEST values (5555.55); insert into NUMTEST values (5555.55) * 行1でエラーが発生しました。: ORA-01438: この列に許容される指定精度より大きな値です SQL> insert into NUMTEST values (-55.5); 1行が作成されました。 SQL> insert into NUMTEST values (-555.5); 1行が作成されました。 SQL> select * from NUMTEST; NUM ---------- 5.5 55.55 555.56 -55.5 -555.5
- 整数桁数 + 少数桁数 を指定するケース
COBOL … 9(3)V9(2)
例
# data division. # working-storage section. # 01 hoge PIC 9(3)V9(2). # # procedure division. # main. 005.50 # move 5.5 TO hoge. DISPLAY hoge. 055.55 # move 55.55 TO hoge. DISPLAY hoge. 234.56 # move 234.567 TO hoge. DISPLAY hoge. 234.56 # move 1234.56 TO hoge. DISPLAY hoge. ←桁オーバー 055.50 # move -55.5 TO hoge. DISPLAY hoge. ←符号なし 555.50 # move -555.5 TO hoge. DISPLAY hoge. ←符号なし
- 数値で桁が指定できないケース その1
EXCEL … ???.??
例
" 5.5 " # 5.5 " 55.55" # 55.55 "555.56" # 555.555 "5555.55" # 5555.55 ←桁オーバー "- 55.5 " # -55.5 ←桁オーバー "-555.5 " # -555.5 ←桁オーバー
- 数値で桁が指定できないケース その2
ORACLE の to_char() … 999.99
例
5.50 # select to_char( 5.5, '999.99') from DUAL; 55.55 # select to_char( 55.55, '999.99') from DUAL; 555.56 # select to_char( 555.555, '999.99') from DUAL; ####### # select to_char(5555.55, '999.99') from DUAL; ←桁オーバー -55.50 # select to_char( -55.5, '999.99') from DUAL; -555.50 # select to_char(-555.5, '999.99') from DUAL;
※符号は+の場合は空白で確保さるため、文字列長は常に 7 桁となる。
要するに、自分の扱っている言語の書式が世の中の標準ではない、というのを肝に銘じておかないと、足元を掬われるハメになる可能性が高いということで(汗