カテゴリ:

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

ROUND

input_expr の丸められた値を返します。

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

CEILFLOORTRUNCATE , TRUNC

構文

ROUND( <input_expr> [ , <scale_expr> [ , <rounding_mode> ] ] )
Copy
ROUND( EXPR => <input_expr> ,
       SCALE => <scale_expr>
       [ , ROUNDING_MODE => <rounding_mode>  ] )
Copy

引数

必須:

input_expr . OR . EXPR => input_expr

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

名前付き引数 EXPR => を指定する場合、名前付き引数 SCALE => も指定する必要があります。

オプション:

scale_expr . OR . SCALE => scale_expr

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

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

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

名前付き引数 SCALE => を指定する場合、その前の名前付き引数として EXPR => を指定する必要があります。

rounding_mode . OR . ROUNDING_MODE => rounding_mode

使用する丸めモード。次の値のいずれかを指定できます。

デフォルト: 'HALF_AWAY_FROM_ZERO'

名前付き引数 ROUNDING_MODE => を指定する場合、その前の名前付き引数として EXPR =>SCALE => の両方を指定する必要があります。

注釈

rounding_mode 引数にいずれかの値を指定する場合、 input_expr のデータ型は、 固定小数点数のデータ型の1つ でなければなりません。

浮動小数点数のデータ型 (例: FLOAT)は、この引数ではサポートされていません。

戻り値

戻り値の型は入力型に基づいています。

  • 入力が FLOAT の場合、戻り値のデータ型は FLOAT です。

  • 入力が NUMBER の場合、戻り値のデータ型は NUMBER です。

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

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

    例:

    • ROUND(3.14::NUMBER(4, 1), 1) が返すデータ型は NUMBER(4, 1) です。

    • ROUND(3.14::NUMBER(4, 0), 0) が返すデータ型は NUMBER(4, 0) です。

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

使用上の注意

  • すべての引数を名前または位置のいずれかで指定する必要があります。一部の引数を名前で、他の引数を位置で指定することはできません。

    引数を名前で指定する場合は、引数名を二重引用符で囲むことはできません。

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

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

  • input_expr または scale_expr のいずれかが NULL の場合、結果は NULL です。

  • デフォルトでは、0.5は切り上げられます。例えば、-0.5は-1.0に四捨五入されます。

    丸めモードを変更して、値の 半数を偶数 に丸める(例: -0.5を0に丸める)には、 rounding_mode 引数に 'HALF_TO_EVEN' を渡します。

    注釈

    rounding_mode 引数を指定する場合、 input_expr 引数のデータ型は、 固定小数点数のデータ型の1つ でなければなりません。

  • 浮動小数点数はおおよその値です。浮動小数点数は、期待どおりに丸められない場合があります。

  • 丸めにより数値がデータ型の値の範囲外になった場合、関数はエラーを返します。

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

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

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

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 |
+----------+-------+-----------------+
Copy

次の2つの例は、デフォルトの丸めモード('HALF_AWAY_FROM_ZERO')と丸めモード 'HALF_TO_EVEN' の使用の違いを示しています。どちらの例も ROUND 関数を2回呼び出し、最初はデフォルトの丸め動作を使用し、次に 'HALF_TO_EVEN' を使用します。

最初の例では、正の入力値2.5を使用しています。

SELECT ROUND(2.5, 0), ROUND(2.5, 0, 'HALF_TO_EVEN');
Copy
+---------------+-------------------------------+
| ROUND(2.5, 0) | ROUND(2.5, 0, 'HALF_TO_EVEN') |
|---------------+-------------------------------|
|             3 |                             2 |
+---------------+-------------------------------+

2番目の例では、負の入力値-2.5を使用しています。

SELECT ROUND(-2.5, 0), ROUND(2.5, 0, 'HALF_TO_EVEN');
Copy
+---------------+--------------------------------+
| ROUND(2.5, 0) | ROUND(-2.5, 0, 'HALF_TO_EVEN') |
|---------------+--------------------------------|
|            -3 |                             -2 |
+---------------+--------------------------------+

次2つの例では、関数の引数を位置ではなく、名前で指定する方法を示します。

SELECT ROUND(
  EXPR => -2.5,
  SCALE => 0);
Copy
+---------------------------------+
| ROUND(EXPR => -2.5, SCALE => 0) |
|---------------------------------|
|                              -3 |
+---------------------------------+
SELECT ROUND(
  EXPR => -2.5,
  SCALE => 0,
  ROUNDING_MODE => 'HALF_TO_EVEN');
Copy
+------------------------------------------------------------------+
| ROUND(EXPR => -2.5, SCALE => 0, ROUNDING_MODE => 'HALF_TO_EVEN') |
|------------------------------------------------------------------|
|                                                               -2 |
+------------------------------------------------------------------+

次の例は、 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)
      ;
Copy

丸めた 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 |
+---------+-------------+---------+-------------+
Copy