PostgreSQLで四捨五入・切り捨て/上げ,小数点以下の桁数を確認する方法

  • Category: SQL
  • Tags: PostgreSQL

  • Posted on: 2021-12-02

  • Updated on: 2022-01-22

本記事では以下の関数を見ていきます.

  • 四捨五入:ROUND()
  • 切り捨て:TRUNC()
  • 大きい側の整数を取得(切り上げ):CEIL()
  • 小さい側の整数を取得:FLOOR()
  • 小数点以下の桁数を数える:SCALE()

例示を見ながら確認していきましょう.

PostgreSQLのバージョン

psql (PostgreSQL) 14.5

事前準備

本記事ではテーブルを作成せずにSELECT文だけを使用します.

四捨五入 ROUND()

四捨五入をするにはROUND()関数を使用します.
四捨五入したい数値を引数として渡すと小数点以下を四捨五入して返してくれます.


SELECT ROUND(10.4)
round
10

SELECT ROUND(10.5)
round
11
表示する小数点以下の位を指定

表示したい小数点以下の位を第二引数で指定することもできます.
以下の例では小数点第一位まで表示するので,小数点第二位が四捨五入されています.


SELECT ROUND(10.554, 1)
round
10.6

参考

第二引数のデフォルトは0(小数点以下で四捨五入)です.

引数を負にすると整数部分での四捨五入もできます.
小数点を起点に2番目なので,十の位で四捨五入されています.


SELECT ROUND(150.554, -2)
round
200

注意

ROUND()は引数として渡すデータ型に依存して返り値が決まります.
渡すデータ型によっては挙動が異なる例もあるようなので,データ型に注意が必要です.

切り捨て TRUNC()

数値の切り捨てにはTRUNC()を使用します.(使い方はROUND()と同様です)
第一引数に数値を渡すと小数点以下を切り捨てて返してくれます.


SELECT TRUNC(198.9)
trunc
198

ROUND()と同様にTRUNC()も表示したい小数点以下の位を第二引数で指定できます.1
以下の例では小数点第二位まで表示するので,小数点第三位以下を切り捨てています.


SELECT TRUNC(198.992, 2)
trunc
198.99

ROUND()と同様に第二引数を負の数にすると整数部分での切り捨てもできます.


SELECT TRUNC(198.992, -1)
trunc
190

大きい側の整数を取得(切り上げ)CEIL()

ややトリッキーな関数ですが,まずはコードを見てみましょう.


SELECT CEIL(10.1)
ceil
11

結果は11となりました.
これは引数の数値について,大きい側の整数を取っているためです.
CEIL()引数が正の値であれば切り上げと同じ挙動です.

10 ・・ 10.1 ・・・・・ 11
       ↑ 引数

引数が負の値であっても大きい側の値を取ります.
ただし,正の値とは異なり切り上げとは違う挙動です.


SELECT CEIL(-10.1)
ceil
-10

切り上げにはなっておらず,大きい方の値を取っています.

-11 ・・・・・ -10.1 ・・ -10
          ↑ 引数

参考

CEIL()CEILING()と同一の関数です.
なおCEIL()に整数を渡すとそのまま帰ってきます(SELECT CEIL(10) -> 10

小さい側の整数を取得(切り捨て)FLOOR()

FLOOR()CEIL()の逆の挙動をする関数です.


SELECT FLOOR(10.1)
floor
10

結果が10となったのは,以下のように引数の数値の小さい側の整数を取っているためです.
FLOOR()引数が正の値であれば切り捨てと同じ挙動です.

10 ・・ 10.1 ・・・・・ 11
     ↑ 引数

引数が負の値であっても小さい側の値を取ります.
ただし,正の値とは異なり切り捨てとは違う挙動です.


SELECT FLOOR(-10.1)
floor
-11

切り捨てにはなっておらず,小さい方の値を取っています.

-11 ・・・・・ -10.1 ・・ -10
        ↑ 引数

小数点以下の桁数を数える SCALE()

小数点以下の桁数を数える関数もあります.


SELECT SCALE(1.23456789)
scale
8

ひとこと

小数点まわりの操作をさらっと見てみました.
SQLでデータを取得する際に必要に応じて使えそうな内容ですね.


  1. 第二引数のデフォルトもROUND()と同様に0(小数点以下で切り捨て)です.