.bankers の振る舞いを説明します。
Sponsor Link
Decimal
詳細に入る前に、Decimal を改めて。
10進数を誤差なく処理するためのクラス。精度を要求されるアプリケーション、例えば金融関係のアプリケーションで使われるタイプです。
Apple のドキュメントは、こちら。
rounded
精度が幾ら良くとも、金融関連の計算で、小数点20位の数字を処理することにあまり意味はないと思いますので、ケースによって、有効桁数を減らしたい時があります。
そのときに、使われるメソッドが、”rounded” です。その際に、端数をどのように処理するかを指定することができます。
処理方法には、切り捨て、切り上げ、四捨五入 等が有名ですが、その他にも指定することができます。それが、bankers です。
- 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 ドキュメントの例
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 の振る舞いを調べてみました。
調べた背景は、ローン計算アプリを開発中に、利息計算での端数処理が必要になったことでした。
計算チェックに使用したオリックス銀行の表では、.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 を正しく使おうとすると結構大変なことに気づいたので、必要に応じて、以下の記事も参照してください。
説明は以上です。
Sponsor Link