カテゴリ:

数値関数 (四捨五入と切り捨て)

ROUND

入力式 の四捨五入された値を返します。

こちらもご参照ください:

CEILFLOORTRUNCATE , TRUNC

構文

ROUND( <input_expr> [, <scale_expr> ] )

引数

入力式

操作する値または式です。データ型は、 FLOAT や NUMBERなどの数値データ型のいずれかでなければなりません。

スケール式

出力の小数点の後に含める桁数です。式は-38~+38の整数に評価される必要があります。

デフォルトでは、 スケール式 はゼロになっています。これは、関数が小数点以下のすべての数字を削除することを意味します。

負の数については、以下の使用上の注意をご参照ください。

戻り値

返される値のデータ型は NUMBER(精度、スケール)です。

入力スケールがゼロ以上の場合、出力スケールは通常入力スケールと一致します。

入力スケールが負の場合、出力スケールは0です。

例:
  • ROUND(3.14、1)によって返されるデータ型は NUMBER(4、1)です。

  • ROUND(3.14、0)によって返されるデータ型は NUMBER(4、0)です。

  • ROUND(33.33、-1)によって返されるデータ型は NUMBER(5、0)です。

スケールがゼロの場合、値は事実上整数になります。

使用上の注意

  • スケール式 が負の場合、数値を調整する小数点の の場所の数を指定します。例えば、スケールが-2の場合、結果は100の倍数になります。

  • スケール式 が入力式のスケールよりも大きい場合、関数は効果がありません。

  • 入力式 または スケール式 のいずれかが NULL の場合、結果は NULLです。

  • 小数の0.5は四捨五入されます。例えば、-0.5は-1.0に四捨五入されます。

  • 浮動小数点数はおおよその値です。浮動小数点数が期待どおりに四捨五入されるという保証はありません。正確な数値を返すには、四捨五入する前に浮動小数点数を小数にキャストすることを推奨します。

  • 四捨五入により数値がデータ型の値の範囲外になった場合、エラーが返されます。

この最初の例は、デフォルトの小数点以下の桁数(0)を持つ ROUND の簡単な例を示しています。

SELECT ROUND(135.135), ROUND(-975.975);
+----------------+-----------------+
| ROUND(135.135) | ROUND(-975.975) |
|----------------+-----------------|
|            135 |            -976 |
+----------------+-----------------+

次の例は、スケールパラメーターに値の範囲を使用しています。

SELECT n, scale, ROUND(n, scale)
  FROM test_ceiling
  ORDER BY n, scale;
+----------+-------+-----------------+
|        N | SCALE | ROUND(N, SCALE) |
|----------+-------+-----------------|
| -975.975 |    -1 |        -980     |
| -975.975 |     0 |        -976     |
| -975.975 |     2 |        -975.98  |
|  135.135 |    -2 |         100     |
|  135.135 |     0 |         135     |
|  135.135 |     1 |         135.1   |
|  135.135 |     3 |         135.135 |
|  135.135 |    50 |         135.135 |
|  135.135 |  NULL |            NULL |
+----------+-------+-----------------+

次の例は、 FLOAT 値が常に正確に保存されるわけではないことを示しています。以下に示すように、.005は.01に四捨五入される場合もあれば、0に四捨五入される場合もあります。四捨五入に違いはありません。実際の違いは、浮動小数点数の基になる表現にあります。1.005は、1.005よりもわずかに小さい数(約1.004999)として保存されます。ただし、 DECIMAL 値は正確な数値として保存され、すべての場合に期待されるように.01に四捨五入されます。

テーブルを作成してロードします。

CREATE OR REPLACE TEMP TABLE rnd1(f float, d DECIMAL(10, 3));
INSERT INTO rnd1 (f, d) VALUES
      ( -10.005,  -10.005),
      (  -1.005,   -1.005),
      (   1.005,    1.005),
      (  10.005,   10.005)
      ;

四捨五入された FLOAT 値と、四捨五入された DECIMAL 値の違いの例を示します。

select f, round(f, 2), 
       d, round(d, 2) 
    from rnd1 
    order by 1;
+---------+-------------+---------+-------------+
|       F | ROUND(F, 2) |       D | ROUND(D, 2) |
|---------+-------------+---------+-------------|
| -10.005 |      -10.01 | -10.005 |      -10.01 |
|  -1.005 |       -1    |  -1.005 |       -1.01 |
|   1.005 |        1    |   1.005 |        1.01 |
|  10.005 |       10.01 |  10.005 |       10.01 |
+---------+-------------+---------+-------------+