エクセルのround関数は四捨五入ですが、それとはちょっと違う銀行丸め(偶数まるめ)を作ってみます。
そもそも銀行丸めとは何なのかはこちらの記事を参照してください。
作成する銀行まるめの仕様
小数第一位の数値を整数値に丸めるものを作ります。仕様はこのようになります。
- 0.5がなければ四捨五入と同じ
- 0.5を含む場合は、結果が偶数になるようにまるめる
具体的には下記の赤文字の場合に通常の四捨五入とは異なることになります。
0.5 → 0
1.5 → 2
2.5 → 2
3.5 → 4
4.5 → 4
5.5 → 6
6.5 → 6
7.5 → 8
8.5 → 8
9.5 → 10
銀行まるめをエクセル関数で実装する
エクセル関数を多重構造にした場合、いきなり作るとエラーになった時に原因が分かりにくいです。順番に作っていきます。
小数部分を取りだすために、まずはTRUNC関数で整数部分を取り出す
=TRUNC(A1)
整数部分が取り出せました。これを元の値から引き算すれば小数部分が求められます。
元の数から小数部分を引き算する
小数部分が取り出せました。
=A1-TRUNC(A1)
しかしこれだと、マイナスの場合に扱いにくい状態です。
というのは、JIS Z8401では「絶対値で四捨五入した後、マイナスの場合にはマイナスに戻す」となっているのに対し、マイナスの値だと切り上げ、切り捨てが逆になってしまうからです。
絶対値にした方がよさそうです。
ABS関数で絶対値にする
ABS関数で絶対値にします。
=ABS(A1-TRUNC(A1))
1.4でも-1.4でも、小数部分は0.4として扱えます。
そしてこれが0.5である場合に、計算を分岐させる必要があります。
if関数で分岐させる
分岐させるために小数部分の絶対値が0.5かどうかを確認します。
今のところは、0.5なのか、そうでないかの表示だけ。
=IF(ABS(A1-TRUNC(A1))=0.5,"0.5だよ","0.5ではないよ")
0.5ではない時は普通に四捨五入したらOKです。
ROUND関数で四捨五入する
0.5に関係しない時には普通にroundで四捨五入します。
=IF(ABS(A1-TRUNC(A1))=0.5,"0.5だよ",ROUND(A1,0))
EVEN関数で偶数に切り上げる
0.5の場合には、元の値の端数の0.5を除いた値を偶数に切り上げます。
偶数切り上げはEVEN関数です。
=IF(ABS(A1-TRUNC(A1))=0.5,EVEN(A1-0.5),ROUND(A1,0))
元の値の端数の0.5を除いた値を算出するにあたり、ここでもマイナスの場合に備えます。ABSで絶対値にします。
ABS関数で絶対値にしてから引き算
マイナスの場合を考慮して、EVEN関数の中で一旦ABS関数を入れ、絶対値にしてから引き算する。
=IF(ABS(A1-TRUNC(A1))=0.5,EVEN(ABS(A1)-0.5),ROUND(A1,0))
マイナスの時にもプラスになってしまっているので、ここを直す必要があります。
銀行まるめを作る SIGN関数でマイナスの場合に-1を取得する
SIGN関数を使えばマイナスの場合に-1が取得できるので、これを掛け算することで値をマイナスに戻せます。
=IF(ABS(A1-TRUNC(A1))=0.5,EVEN(ABS(A1)-0.5)*SIGN(A1),ROUND(A1,0))
まとめ
「絶対値で四捨五入した後、マイナスの場合にはマイナスに戻す」という方針のためには
- 小数部分を絶対値で取り出し、0.5ではない場合には通常通りの四捨五入をする
- 小数部分の絶対値が0.5の場合、偶数切り上げをする
- 最後に、マイナス値だった場合にはマイナス値に戻す
※今回の例は、あくまでも小数第一位を整数にするものです。
コメント