[Swift] DecimalNumber.RoundingMode での .bankers の振る舞い説明

Swift

     

TAGS:

⌛️ < 1 min.
RoundingModeで、.up や .downは分かりやすいんですが、.bankersってなんでしょうか?
.bankers の振る舞いを説明します。

Decimal

詳細に入る前に、Decimal を改めて。

10進数を誤差なく処理するためのクラス。精度を要求されるアプリケーション、例えば金融関係のアプリケーションで使われるタイプです。

Apple のドキュメントは、こちら

rounded

精度が幾ら良くとも、金融関連の計算で、小数点20位の数字を処理することにあまり意味はないと思いますので、ケースによって、有効桁数を減らしたい時があります。
そのときに、使われるメソッドが、”rounded” です。その際に、端数をどのように処理するかを指定することができます。

処理方法には、切り捨て、切り上げ、四捨五入 等が有名ですが、その他にも指定することができます。それが、bankers です。

rounded で指定できる処理方法
plain
四捨五入
up
切り上げ
down
切り捨て
bankers
??

切り捨て、切り上げ、四捨五入は、学校等でも習ってくると思いますが、bankers は、?? です。

Apple のドキュメントによると、
“Round to the closest possible return value; when halfway between two possibilities, return the possibility whose last digit is even.”
と買いてあります。

Apple ドキュメントの例

DecimalRounded

rounded 使ってみた

上の表でもなんとなくはわかるのですが、実際に試してみました。

Decimal(10.49).rounded(0, .bankers)  -> 10
Decimal(10.5).rounded(0, .bankers)   -> 10
Decimal(10.51).rounded(0, .bankers)  -> 11

Decimal(11.49).rounded(0, .bankers)  -> 11
Decimal(11.5).rounded(0, .bankers)   -> 12
Decimal(11.51).rounded(0, .bankers)  -> 12

ドキュメントの通り、最後の数字が、偶数になることが可能であれば、偶数になる数値が、返されました。(10.5 では、10を。11.5 では、12 を返すので、五捨六入 とも違います。)

銀行員は、偶数が好きなんでしょうね。

まとめ

DecimalNumber の rounded の振る舞いを調べてみました。

調べた背景は、ローン計算アプリを開発中に、利息計算での端数処理が必要になったことでした。

MEMO

計算チェックに使用したオリックス銀行の表では、.bankerではなく、.plainで計算していると思われます。
.plainは、”Round to the closest possible return value; when caught halfway between two positive numbers, round up; when caught between two negative numbers, round down.”という振る舞いです。要は、近い側に寄せる。ぴったりの中央ならば、正の数ならば.up、負の数ならば、.down (絶対値として大きい方に寄せる)という振る舞いです。

もしかすると、銀行によって、端数処理の方法が違うかもしれないので、銀行側が何を使っているかも調べる必要がありそうです。

.bankersオプションも歴史的に使われているんでしょうけど、どんな歴史なのか興味あります。

なお、Decimal を正しく使おうとすると結構大変なことに気づいたので、必要に応じて、以下の記事も参照してください。

Swift [Swift] Decimal の初期化には注意が必要

説明は以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です