Oracle標準のROUND
関数は四捨五入です。
偶数丸め(JIS丸め、銀行丸め)を行うには関数を自作する必要があります。
基本的な考え方
単純な整数への丸めを行うケースを考えます。
- 端数がちょうど0.5かどうかを判定するため、絶対値を1で割ります。
余りが0.5のとき偶数丸めを行う必要がありますが、その他の場合は四捨五入と同じですので、ROUND
関数が使えます。 - 実は、偶数丸めを行うためには、絶対値を1でなく2で割った方が良いです。
2で割った場合、余りが0.5または1.5のときに偶数丸めが必要となります。
余りが0.5のときは切り捨て(TRUNCATE
)を行い、 余りが1.5のときは切り上げ(四捨五入ですのでROUND
関数が使えます)を行うことで偶数丸めが実現できます。
関数
以上を関数にまとめると、以下のようになります。
CREATE OR REPLACE FUNCTION ROUND_HALF_EVEN(
n NUMBER,
integer NUMBER DEFAULT 0
) RETURN NUMBER
IS
BEGIN
IF MOD(ABS(n) * POWER(10, integer), 2) = 0.5 THEN
RETURN TRUNC(n, integer);
ELSE
RETURN ROUND(n, integer);
END IF;
END;
Oracle Database 18c から ROUND_TIES_TO_EVEN
関数が実装されました。
No comments:
Post a Comment