【PostgreSQL】四捨五入・切り上げ・切り捨て(Round)

2021年1月2日PostgreSQL自作関数

概要

四捨五入、切り上げ、切り捨て用の自作関数です。

「第〇位」を「四捨五入、切り上げ、切り捨て」か、分けることができるようになっています。

 

この自作関数で使っている構文

この関数では、標準的に用意されている次の関数を使用しています。

-- 1.四捨五入
round(数値 , 小数点以下をこの桁数にする)  -- 四捨五入
-- 例
select * From round(123.45678,3);      -- 123.457(小数第3位四捨五入)

-- 2.切り捨て
trunc(数値 , 小数点以下をこの桁数にする)  -- 切り捨て
-- 例
select * From trunc(123.45678,3);      -- 123.456(小数第3位切り捨て)

 

引数

引数1(numeric): 四捨五入する対象の数値

引数2(integer) : 計算するフラグ (1:四捨五入、2:切り上げ、3:切り捨て)

引数3(integer) : 小数点何桁まで表示するか(2を指定:小数2桁まで表示する)

 

返り値

計算後の値

 

コード

CREATE OR REPLACE FUNCTION round(
    numeric,
    integer,
    integer)
  RETURNS numeric AS
$BODY$
declare

	n_target        alias for $1; 	--引数1:四捨五入する対象の数値
	i_flg           alias for $2; 	--引数2:計算するフラグ (1:四捨五入、2:切り上げ、3:切り捨て)
	i_digits        alias for $3; 	--引数3:小数点何桁まで表示するか(2を指定:小数2桁まで表示する)
	c_add           character varying;

begin

	if i_flg = 1 then
		--四捨五入
		return round(n_target,i_digits);
	
	elseif i_flg = 2 then
		--切り上げ
		c_add ='0.';
		FOR i IN 1..i_digits LOOP
		    c_add = c_add || '0';
		END LOOP;
		c_add = c_add || '9';

		return trunc(n_target + cast(c_add as numeric),i_digits);
	
	elseif i_flg = 3 then
		--切り捨て
		return trunc(n_target,i_digits);
	end if;

	return null;

end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

※ PostgreSQL9.5 , 9.6 , 10 , 11 , 12で動作確認済み 自作関数の実行方法はこちら

 

実行例(呼び出し例)

四捨五入

--小数第3位四捨五入(小数2桁まで表示する)
select * From round(1.2345678,1,2);  --  '1.23'

 

切り上げ

--小数第4位切り上げ(小数3桁まで表示する)
select * From round(1.2345678,2,3);  --'1.235'
 

切り捨て

--小数第4位切り捨て(有効桁数3桁)
select * From round(1.2345678,3,3);  --'1.234'

 

関連記事

数値であるかのチェック(IsNumeric)

文字から数値、数値から文字へ変換する

数値をカンマで区切る【自作関数】