[情報技術] 数値フォーマットの表現方法の違い

2015年1月4日

 小数点つきデータを文字列化する書式が、言語によって違い、いろいろな文化があります。
 代表的な書式文字列と、それを与えた場合どんな出力なるか、を確認してみた結果が以下。

  • 符号,小数点を「含む」全桁数 + 小数点以下の桁数 を指定するケース その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 桁となる。

 要するに、自分の扱っている言語の書式が世の中の標準ではない、というのを肝に銘じておかないと、足元を掬われるハメになる可能性が高いということで(汗






カテゴリー: 情報技術

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org