やじゅ@アプリケーション・ラボ わんくま支局

目次

Blog 利用状況

ニュース

プロフィール

MSMVP

*消費税率アップと四捨五入問題


今日、2014/4/1から消費税が8%となりました。

出社すると机の上に付箋紙が置かれておりました。何やら嫌な予感が…
どうやら、以前関わったプロジェクトの会計アプリケーションで、明細の合計が合わないとユーザーから問い合わせがあったようです。

消費税率は設定画面で変更出来るようなっています。お金に関わる部分なので、開発時には念入りにテストパターンを作成してテストしました。
消費税率が5%から8%に変わった、つまり奇数から偶数になったからといって誤差が出るのか、頭の中は不安でいっぱいでした。

とりあえずユーザーに連絡し、問題となっているデータを送ってもらい原因を調査することになりました。
1時間後、ユーザーからメールが送られてきたので早速調査を開始しました。
会計処理の設定では、明細ごと消費税率を四捨五入していました。そして消費税率が8%かと思いきや5%のままでした。
確かに4月1日になったとはいえ、会計処理としてはまだ3月分を入力しているわけです。

送って頂いたデータを展開してみたのですが、明細の合計は合っていました。
あれれ、いったいユーザーは何で明細の合計が合わないと判断したのでしょうか?

ユーザーに再度連絡してみました。するとユーザー自身がExcelで別途計算した合計と2円合わないとのことでした。
これには思い当たるふしあります、それは算術型丸め (四捨五入)/ 銀行型丸め (ISO 丸め)です。

会計アプリケーションはC#で開発され、四捨五入する際にはROUND関数の既定の銀行型丸めを採用していたからです。
例 1050 x 0.05 = 52.5  算術型丸めでは53、銀行型丸めでは52円となります。
これだけでも誤差が1円あります、2明細あれば合計で2円誤差が出てきます。

Excelでは、セル関数のRoundでは算術型丸めが採用されています。ちなみにVBAのRoundでは銀行丸めです。困ったもんだ。

ユーザーには四捨五入する方法が、Excelと会計アプリケーションでは違いがあることと
VBAを使わないで銀行丸めする方法をネットで調べ、
「=Round(対象セル,0)」
   ↓
「=IF(ABS(MOD(対象セル,1))=0.5,INT(対象セル/2+0.5)*2,ROUND(対象セル,0))」
に変更することで対応できる旨を説明しました。


しかし、ユーザーがお怒りモードで「算術型丸めとか銀行型丸めとか訳が分からない、頭を丸めて謝れ」と丸めに引っ掛けた返信がきました。
あらら、困ったものだw


消費税率が8%になるってことは、1桁目が7の場合には0.56になりますから、銀行型丸めでも必ず1円繰り上がるんですよね。
消費税率が5%の時の方が誤差の問題が起こりえたわけです。

 

なお、4/1はエイプリルフールです。

投稿日時 : 2014年4月1日 2:43

コメントを追加

No comments posted yet.
タイトル  
名前  
URL
コメント