- カテゴリ:
数値関数 (四捨五入と切り捨て)
ROUND¶
input_expr
の丸められた値を返します。
- こちらもご参照ください。
構文¶
ROUND( <input_expr> [ , <scale_expr> [ , '<rounding_mode>' ] ] )
ROUND( EXPR => <input_expr> ,
SCALE => <scale_expr>
[ , ROUNDING_MODE => '<rounding_mode>' ] )
引数¶
必須:
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です。
入力スケールが一定でない場合、返される型のスケールは入力式のスケールと同じになります。
スケールがゼロの場合、値は事実上 INTEGER になります。
例:
ROUND(3.14::FLOAT, 1)
が返すデータ型は FLOAT です。NUMBER によって返される
ROUND(3.14, 1)
はスケール1で、精度は少なくとも3です。NUMBER によって返される
ROUND(-9.99, 0)
はスケール0で、精度は少なくとも2です。NUMBER によって返される
ROUND(33.33, -1)
はスケール0で、精度は少なくとも3です。
input_expr
または scale_expr
のいずれかが NULLの場合、関数は を返します NULL。
使用上の注意¶
すべての引数を名前または位置のいずれかで指定する必要があります。一部の引数を名前で、他の引数を位置で指定することはできません。
引数を名前で指定する場合は、引数名を二重引用符で囲むことはできません。
scale_expr
が負の場合、数値を調整する小数点の 前 の場所の数を指定します。例えば、スケールが-2の場合、結果は100の倍数になります。scale_expr
が入力式のスケールよりも大きい場合、関数は効果がありません。デフォルトでは、0.5は切り上げられます。例えば、-0.5は-1.0に四捨五入されます。
丸めモードを変更して、値の 半数を偶数 に丸める(例: -0.5を0に丸める)には、
'HALF_TO_EVEN'
引数にrounding_mode
を渡します。注釈
rounding_mode
引数を指定する場合、input_expr
引数のデータ型は、 固定小数点数のデータ型の1つ でなければなりません。浮動小数点数はおおよその値です。浮動小数点数は、期待どおりに丸められない場合があります。
丸めにより数値がデータ型の値の範囲外になった場合、関数はエラーを返します。
例¶
この最初の例は、デフォルトの小数点以下の桁数(0)を持つ ROUND の簡単な使用を示しています。
SELECT ROUND(135.135), ROUND(-975.975);
+----------------+-----------------+
| ROUND(135.135) | ROUND(-975.975) |
|----------------+-----------------|
| 135 | -976 |
+----------------+-----------------+
次の例では、次のテーブルのデータをクエリします。
CREATE TABLE test_ceiling (n FLOAT, scale INTEGER);
INSERT INTO test_ceiling (n, scale) VALUES
(-975.975, -1),
(-975.975, 0),
(-975.975, 2),
( 135.135, -2),
( 135.135, 0),
( 135.135, 1),
( 135.135, 3),
( 135.135, 50),
( 135.135, NULL);
テーブルをクエリし、scale_expr
引数に値の範囲を使用します:
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 |
+----------+-------+-----------------+
次の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');
+---------------+-------------------------------+
| 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');
+----------------+--------------------------------+
| ROUND(-2.5, 0) | ROUND(-2.5, 0, 'HALF_TO_EVEN') |
|----------------+--------------------------------|
| -3 | -2 |
+----------------+--------------------------------+
次2つの例では、関数の引数を位置ではなく、名前で指定する方法を示します。
SELECT ROUND(
EXPR => -2.5,
SCALE => 0) AS named_arguments;
+-----------------+
| NAMED_ARGUMENTS |
|-----------------|
| -3 |
+-----------------+
SELECT ROUND(
EXPR => -2.5,
SCALE => 0,
ROUNDING_MODE => 'HALF_TO_EVEN') AS named_with_rounding_mode;
+--------------------------+
| NAMED_WITH_ROUNDING_MODE |
|--------------------------|
| -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);
丸めた 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 |
+---------+-------------+---------+-------------+