数値割り当て

数値割り当ての基本規則は、10 進数または整数の整数部分を 切り捨てることはできないということです。 10 進数の小数部分は、必要に応じて切り捨てられます。

10 進数または整数から浮動小数点へ

浮動小数点数は実数の近似値なので、浮動小数点の列または変数に 10 進数または整数を割り当てた結果は、元の数値と 同じにならない場合もあります。

浮動小数点数または 10 進数から整数へ

単精度浮動小数点数を整数に変換する場合は、有効数字の 7 桁目で 丸めが行われ、必要に応じて、有効数字の 7 桁目から数値の終わり までゼロが追加されます。また、数値の小数部分は除去されます。 倍精度浮動小数点数または 10 進数を整数に変換する場合は、 数値の小数部分が除去されます。

次の例は、単精度浮動小数点数が整数に変換されたものです

Floating-point number:           Results when assigned to an integer column
                                  or host variable:
2.0000045E6                      2000000
2.00000555E8                     200001000 

次の例は、倍精度浮動小数点数を整数に変換したものです

Floating-point number:           Results when assigned to an integer column
                                  or host variable:
2.0000045E6                      2000004
2.00000555E8                     200000555 

次の例は、小数点以下の数字が整数に変換される様子を示しています

Decimal number:                  Results when assigned to an integer column
                                  or host variable:
2000004.5                        2000004
200000555.0                      200000555 

10 進数から 10 進数へ

10 進数が 10 進数の列または変数に代入される場合、その数値は、必要に応じてターゲットの精度および位取りに変換されます。

先行ゼロが必要な数だけ追加または除去されます。 また、数値の小数部分では、必要な数のゼロが末尾に追加されるか、 末尾桁が必要な数だけ除去されます。

10 進数から DECFLOAT へ

10 進数が DECFLOAT の列または変数に割り当てられる場合、数値は割り当て先の精度 (16 または 34) に変換されます。 先行ゼロは除去されます。

10 進数の精度と位取り、および割り当て先の精度に応じて、収容するために値が丸められることがあります。

CREATE VIEW 以外の静的 SQL ステートメントの場合、ROUNDING バインド・オプションまたはネイティブ SQL プロシージャーのオプションが丸めモードを決定します。

動的 SQL ステートメント (および静的 CREATE VIEW ステートメント) の場合、特殊レジスター CURRENT DECFLOAT ROUNDING MODE が丸めモードを決定します。

整数から 10 進数へ

10 進数の列または変数に整数を割り当てる場合、数値は一時的 に 10 進数に変換された後で、必要に応じて割り当て先の精度と 位取りに合った形にされます。

一時的な 10 進数の精度と位取りは、短精度整数では 5,0、長精度整数では 11,0、 64 ビット整数では 19,0 です。

整数から DECFLOAT へ

整数を DECFLOAT 列または変数に割り当てる場合、数値はまず一時的に 10 進数に変換された後、DECFLOAT に変換されます。

一時的な 10 進数の精度と位取りは、短精度整数では 5,0、長精度整数では 11,0、 64 ビット整数では 19,0 です。 小数点は、小数点からDECFLOATへの変換ルールを使用して、DECFLOATに変換されます。 小数点以下を参照。

浮動小数点から浮動小数点へ

倍精度浮動小数点数の列または変数に 単精度の浮動小数点数 を割り当てる場合は、単精度データに 8 つの 16 進ゼロが埋め込まれます。 単精度浮動小数点数の列または変数に 倍精度の浮動小数点数を割り当てる場合、 倍精度データは変換されて 16 進数字の 7 桁目で切り上げが行われます。

FLOAT(IEEE) SQL 処理オプションを指定して準備されたアセンブラー、C、または C++ アプリケーションでは、ホスト変数内の浮動小数点定数と浮動小数点値は、IEEE 浮動小数点形式を持つと想定されます。 浮動小数点データはすべて、 Db2 に System/390® 浮動小数点形式で保存されます。

したがって、FLOAT(IEEE) SQL処理オプションが有効になっている場合、 Db2 は以下の変換を行います

  • IEEEの短形式または長形式の浮動小数点フォーマットの数値が単精度または倍精度浮動小数点型カラムに割り当てられると、 Db2 は数値を System/390 浮動小数点フォーマットに変換します。
  • 単精度または倍精度浮動小数点型の列値がショートまたはロング浮動小数点型のホスト変数に割り当てられると、 Db2 は列値をIEEE浮動小数点形式に変換します。

浮動小数点から 10 進数へ

単精度浮動小数点数を 10 進数の列または変数に割り当てる場合、 数値はまず一時的に 10 進数に変換されます。

10 進数の列または変数に単精度浮動小数点数を割り当てる場合、 数値は、まずはじめに 10 進数字の 7 桁目で丸めが行われて一時的 に精度が 6 の 10 進数に変換されます。 次に、精度を 31 にするために、その 数値にゼロが 25 個追加されます。 丸めが行われるため、0.5×10-6 より小さな数値は 0 になります。

10 進数の列または変数に倍精度浮動小数点数を割り当てる場合、 数値は一時的に精度が 15 の 10 進数に変換された後で、必要に応じて 割り当て先の精度および位取りに合わせて切り捨てられます。 この変換においては、 精度を 16 にするために、必要に応じて数値の末尾にゼロが追加されます。 さらに、数値は (浮動小数点演算を使って) 10 進数 の 16 桁目で丸められ、15 桁の数値となります。 丸めが原因で、マグニチュードが 0.5 × 10-15 より小さい数値は 0 に減らされます。 小数点の左側に 15 桁を超える数字が必要な場合は、エラーが報告されます。 そうでなければ、位取りには、その数値の整数部分を有効数字が 脱落したりすることなく表せる範囲内で可能な最大値が与えられます。

以下の例は、倍精度浮動小数点数を 10 進数に変換した結果を示したものです。

  • 浮動小数点数 .123456789098765E-05 の十進表記は、 .00000123456789098765 です。 丸めにより 16 桁目に 5 が加算されて、数値は .00000123456789148765 となり、この結果を切り捨てて .000001234567891 とします。 次に、31 桁の結果の末尾にゼロが追加され、数値は .0000012345678910000000000000000 となります。
  • 浮動小数点数 1.2339999999999E+01 の十進表記は、 12.33999999999900 です。 丸めにより 16 桁目に 5 が加算されて、数値は 12.33999999999905 となり、この結果を切り捨てて 12.3399999999990 とします。 次に、31 桁の結果の末尾にゼロが追加され、数値は 12.33999999999900000000000000000 となります。

浮動小数点から DECFLOAT へ

単精度または倍精度の浮動小数点数を DECFLOAT 列または変数に割り当てる場合、 数値はまず浮動小数点数の一時ストリング表現に変換されます。 次に、そのストリング表現が DECFLOAT に変換されます。

DECFLOAT から整数へ

DECFLOAT が 2 進整数の列または変数に割り当てられる場合、数値の小数部分は失われます。

次の例は、小数点以下の浮動小数点数が整数に変換されたものです

Decimal floating-point number:           Results when assigned to an integer column
                                         or host variable:
2.0000045E6                              2000004
2.00000555E8                             200000555 

DECFLOAT から 10 進数へ

DECFLOAT 値が 10 進数の列または変数に割り当てられる場合、DECFLOAT は、必要に応じて、割り当て先の精度と位取りに変換されます。

割り当て時に、先行ゼロが必要な数だけ追加されます。また、数値の小数部分では、必要な数のゼロが末尾に追加されるか、丸めが行われます。

CREATE VIEW 以外の静的 SQL ステートメントの場合、ROUNDING バインド・オプションまたはネイティブ SQL プロシージャーのオプションが丸めモードを決定します。

動的 SQL ステートメント (および静的 CREATE VIEW ステートメント) の場合、特殊レジスター CURRENT DECFLOAT ROUNDING MODE が丸めモードを決定します。

次の例は、小数浮動小数点数を小数に変換したものです

Decimal floating-point number:           Results when assigned to an decimal(15,0)
                                         column or host variable:
2.0000045E6                              2000005
Decimal floating-point number:           Results when assigned to an decimal(15,2)
                                         column or host variable:
2.0000045E6                              2000004.50
2.00000555E8                             200000555.00 

DECFLOAT から浮動小数点へ

浮動小数点数は実数の近似値なので、DECFLOAT 値を浮動小数点の列または変数に割り当てた結果は、元の数値と同じにならない場合があります。

DECFLOAT 値は、最初にストリング表現に変換されてから、浮動小数点数に変換されます。

DECFLOAT(16) から DECFLOAT(34) へ

DECFLOAT(16) が DECFLOAT(34) 列または変数に割り当てられる場合、ソースの指数は結果の形式の対応する指数に変換され、係数は左側にゼロを付加して拡張されます。

DECFLOAT(34) から DECFLOAT(16) へ

DECFLOAT(34) が DECFLOAT(16) 列または変数に割り当てられる場合、ソースの指数は結果の形式の対応する指数に変換されます。

ソースの係数は割り当て先の精度に丸められます。

静的 SQL ステートメントの場合、ROUNDING バインド・オプションまたはネイティブ SQL プロシージャーのオプションが丸めモードを決定します。

CREATE VIEW 以外の静的 SQL ステートメントの場合、ROUNDING バインド・オプションまたはネイティブ SQL プロシージャーのオプションが丸めモードを決定します。

動的 SQL ステートメント (および静的 CREATE VIEW ステートメント) の場合、特殊レジスター CURRENT DECFLOAT ROUNDING MODE が丸めモードを決定します。

COBOL 整数へ

COBOL 整変数への割り当てには、最大サイズの整数が使用されます。

したがって、COBOL データ項目に入れられる値が、 値の範囲を超過してしまうことがあります。

COBOL は、SQL には相当するものがない、いくつかのデータ・タイプをサポートしています (BINARY 10 進データ項目や DISPLAY 10 進データ項目など)。 ほとんどの場合、COBOL ステートメントを使用して、 サポートされていない COBOL データ・タイプ と SQL がサポートするデータ・タイプとの間で変換することができます。

Db2 for z/OS® では、HOST変数として許可されているBINARY数値変数は、整数バイナリ変数のみです。 SQL でサポートされる DECIMAL ホスト変数は、パック 10 進ホスト変数のみです。

例えば、 COL1 に 12345 の値が含まれている場合、 A が 4 桁のみで定義されているにもかかわらず、以下のステートメントにより、12345 の値が A に配置されます

   01  A  PIC  S9999  BINARY.
   EXEC SQL SELECT COL1
            INTO :A
            FROM TABLEX
   END-EXEC.

次の例のCOBOLステートメントの結果、2345が A に格納されます

   MOVE 12345 TO A.