ClickHouse/docs/ja/sql-reference/functions/rounding-functions.md
2024-11-18 11:58:58 +09:00

13 KiB

slug sidebar_position sidebar_label
/ja/sql-reference/functions/rounding-functions 155 丸め

丸め関数

floor

x 以下の最大の切り捨て数値を返します。切り捨て数値は 1 / 10 * N の倍数であり、1 / 10 * N が正確でない場合、適切なデータ型に最も近い数値です。

整数の引数は負の N 引数で丸められ、非負の N の場合、関数は x を返します。つまり、何もしません。

丸めによりオーバーフローが発生した場合(例: floor(-128, -1))、結果は未定義です。

構文

floor(x[, N])

パラメーター

  • x - 丸める値。Float*Decimal*、または (U)Int*
  • N . (U)Int*。デフォルトはゼロで、整数への丸めを意味します。負にすることも可能です。

返される値

x と同じ型の切り捨て数値。

クエリ:

SELECT floor(123.45, 1) AS rounded

結果:

┌─rounded─┐
│   123.4 │
└─────────┘

クエリ:

SELECT floor(123.45, -1)

結果:

┌─rounded─┐
│     120 │
└─────────┘

ceiling

floor と似ていますが、x 以上の最小の切り上げ数値を返します。

構文

ceiling(x[, N])

別名: ceil

truncate

floor と似ていますが、x の絶対値以下の最大絶対値を持つ切り捨て数値を返します。

構文

truncate(x[, N])

別名: trunc.

クエリ:

SELECT truncate(123.499, 1) as res;
┌───res─┐
│ 123.4 │
└───────┘

round

指定された小数点以下の桁数に値を丸めます。

この関数は、指定されたオーダーの最も近い数値を返します。入力値が隣接する2つの数値に等しい距離の場合、この関数は Float* 入力に対してはバンカーズ・ラウンディングを使用し、他の型(Decimal*)に対しては零から遠ざけて丸めます。

構文

round(x[, N])

引数

  • x — 丸める数値。Float*Decimal*、または (U)Int*
  • N — 丸める小数点以下の桁数。整数。デフォルトは 0
    • N > 0 の場合、関数は小数点以下を丸めます。
    • N < 0 の場合、関数は小数点の左を丸めます。
    • N = 0 の場合、関数は次の整数に丸めます。

返される値:

x と同じ型の切り捨て数値。

Float 入力の場合の例:

SELECT number / 2 AS x, round(x) FROM system.numbers LIMIT 3;
┌───x─┬─round(divide(number, 2))─┐
│   0 │                        0 │
│ 0.5 │                        0 │
│   1 │                        1 │
└─────┴──────────────────────────┘

Decimal 入力の場合の例:

SELECT cast(number / 2 AS  Decimal(10,4)) AS x, round(x) FROM system.numbers LIMIT 3;
┌───x─┬─round(CAST(divide(number, 2), 'Decimal(10, 4)'))─┐
│   0 │                                                0 │
│ 0.5 │                                                1 │
│   1 │                                                1 │
└─────┴──────────────────────────────────────────────────┘

末尾のゼロを保持するには、設定 output_format_decimal_trailing_zeros を有効にします:

SELECT cast(number / 2 AS  Decimal(10,4)) AS x, round(x) FROM system.numbers LIMIT 3 settings output_format_decimal_trailing_zeros=1;

┌──────x─┬─round(CAST(divide(number, 2), 'Decimal(10, 4)'))─┐
│ 0.0000 │                                           0.0000 │
│ 0.5000 │                                           1.0000 │
│ 1.0000 │                                           1.0000 │
└────────┴──────────────────────────────────────────────────┘

最も近い数値への丸めの例:

round(3.2, 0) = 3
round(4.1267, 2) = 4.13
round(22,-1) = 20
round(467,-2) = 500
round(-467,-2) = -500

バンカーズ・ラウンディング。

round(3.5) = 4
round(4.5) = 4
round(3.55, 1) = 3.6
round(3.65, 1) = 3.6

関連項目

roundBankers

指定された小数位置に数値を丸めます。

丸める数値が2つの数値の中間にある場合、この関数はバンカーズ・ラウンディングを使用します。バンカーズ・ラウンディングは、数値を丸める方法で、数値が中間にある場合、指定された小数位置で最も近い偶数に丸められます。例えば: 3.5は4に丸められ、2.5は2に丸められます。これは、IEEE 754で定義された浮動小数点数のデフォルトの丸め方法です。round 関数も同じ丸めを浮動小数点数に対して行います。roundBankers 関数も整数を同じ方法で丸めます。例えば、 roundBankers(45, -1) = 40

他のケースでは、関数は数値を最も近い整数に丸めます。

バンカーズ・ラウンディングを使用することで、この数値を合計または減算する結果に対する丸め数値の影響を減少させることができます。

例えば、1.5、2.5、3.5、4.5を異なる丸めで合計します:

  • 丸めなし: 1.5 + 2.5 + 3.5 + 4.5 = 12.
  • バンカーズ・ラウンディング: 2 + 2 + 4 + 4 = 12.
  • 最も近い整数への丸め: 2 + 3 + 4 + 5 = 14.

構文

roundBankers(x [, N])

引数

- `N > 0` — 関数は小数点以下の右側にある指定された位置に数値を丸めます。例: `roundBankers(3.55, 1) = 3.6`。
- `N < 0` — 関数は小数点左側の指定された位置に数値を丸めます。例: `roundBankers(24.55, -1) = 20`。
- `N = 0` — 関数は数値を整数に丸めます。この場合、引数は省略可能です。例: `roundBankers(2.5) = 2`。
  • x — 丸める数値。Float*Decimal*、または (U)Int*
  • N — 丸める小数点以下の桁数。整数。デフォルトは 0
    • N > 0 の場合、関数は小数点以下を丸めます。
    • N < 0 の場合、関数は小数点の左を丸めます。
    • N = 0 の場合、関数は次の整数に丸めます。

返される値

バンカーズ・ラウンディング法で丸めれた値。

クエリ:

 SELECT number / 2 AS x, roundBankers(x, 0) AS b fROM system.numbers limit 10

結果:

┌───x─┬─b─┐
│   0 │ 0 │
│ 0.5 │ 0 │
│   1 │ 1 │
│ 1.5 │ 2 │
│   2 │ 2 │
│ 2.5 │ 2 │
│   3 │ 3 │
│ 3.5 │ 4 │
│   4 │ 4 │
│ 4.5 │ 4 │
└─────┴───┘

バンカーズ・ラウンディングの例:

roundBankers(0.4) = 0
roundBankers(-3.5) = -4
roundBankers(4.5) = 4
roundBankers(3.55, 1) = 3.6
roundBankers(3.65, 1) = 3.6
roundBankers(10.35, 1) = 10.4
roundBankers(10.755, 2) = 10.76

関連項目

roundToExp2

数値を受け取り、その数値が1未満の場合、0 を返します。それ以外の場合は、最も近い2の指数に丸めます。

構文

roundToExp2(num)

パラメーター

返される値

  • num が1未満の場合 0UInt8
  • num を最も近い2の指数に丸めます。UInt/Float

クエリ:

SELECT *, roundToExp2(*) FROM system.numbers WHERE number IN (0, 2, 5, 10, 19, 50)

結果:

┌─number─┬─roundToExp2(number)─┐
│      0 │                   0 │
│      2 │                   2 │
│      5 │                   4 │
│     10 │                   8 │
│     19 │                  16 │
│     50 │                  32 │
└────────┴─────────────────────┘

roundDuration

数値を受け取り、その数値が1未満の場合、0 を返します。それ以外の場合は、よく使われる期間のセットから最も近い数値に丸めます: 1, 10, 30, 60, 120, 180, 240, 300, 600, 1200, 1800, 3600, 7200, 18000, 36000

構文

roundDuration(num)

パラメーター

  • num: よく使われる期間セットの一つに丸める数値。UInt/Float

返される値

  • num が1未満の場合 0
  • それ以外の場合: 1, 10, 30, 60, 120, 180, 240, 300, 600, 1200, 1800, 3600, 7200, 18000, 36000 の一つ。UInt16

クエリ:

SELECT *, roundDuration(*) FROM system.numbers WHERE number IN (0, 9, 19, 47, 101, 149, 205, 271, 421, 789, 1423, 2345, 4567, 9876, 24680, 42573)

結果:

┌─number─┬─roundDuration(number)─┐
│      0 │                     0 │
│      9 │                     1 │
│     19 │                    10 │
│     47 │                    30 │
│    101 │                    60 │
│    149 │                   120 │
│    205 │                   180 │
│    271 │                   240 │
│    421 │                   300 │
│    789 │                   600 │
│   1423 │                  1200 │
│   2345 │                  1800 │
│   4567 │                  3600 │
│   9876 │                  7200 │
│  24680 │                 18000 │
│  42573 │                 36000 │
└────────┴───────────────────────┘

roundAge

さまざまな一般的な人間の年齢範囲内で数値を受取り、その範囲内の最大または最小値を返します。

構文

roundAge(num)

パラメーター

  • age: 年齢を表す数値(年単位)。UInt/Float

返される値

  • age が1未満の場合 0 を返します。
  • 1 <= age <= 17 の場合 17 を返します。
  • 18 <= age <= 24 の場合 18 を返します。
  • 25 <= age <= 34 の場合 25 を返します。
  • 35 <= age <= 44 の場合 35 を返します。
  • 45 <= age <= 54 の場合 45 を返します。
  • age >= 55 の場合 55 を返します。

型: UInt8

クエリ:

SELECT *, roundAge(*) FROM system.numbers WHERE number IN (0, 5, 20, 31, 37, 54, 72);

結果:

┌─number─┬─roundAge(number)─┐
│      0 │                0 │
│      5 │               17 │
│     20 │               18 │
│     31 │               25 │
│     37 │               35 │
│     54 │               45 │
│     72 │               55 │
└────────┴──────────────────┘

roundDown

数値を受け取り、指定された配列内の要素に対して切り捨てを行います。値が最も低い境界よりも小さい場合、最も低い境界が返されます。

構文

roundDown(num, arr)

パラメーター

  • num: 切り捨てする数値。Numeric
  • arr: age を切り捨てするための要素の配列。ArrayUInt/Float型。

返される値

  • 配列arr の要素に切り捨てられた数値。値が最も低い境界より小さい場合、最も低い境界が返されます。UInt/Float型はarrの型により決定されます。

クエリ:

SELECT *, roundDown(*, [3, 4, 5]) FROM system.numbers WHERE number IN (0, 1, 2, 3, 4, 5)

結果:

┌─number─┬─roundDown(number, [3, 4, 5])─┐
│      0 │                            3 │
│      1 │                            3 │
│      2 │                            3 │
│      3 │                            3 │
│      4 │                            4 │
│      5 │                            5 │
└────────┴──────────────────────────────┘