記事カテゴリ

ユーザー機能


 2024年4月19日(金) 23:54 JST

数値の丸め方っていろいろあるんだ

  • 投稿者:
  • 表示回数
    8,255

数値を扱う際に数値を丸めることは日常的に行われています。
その方法は、切り捨て/切り上げ/四捨五入 と考えるのが最も一般的であるかと思います。
このように列挙すると他に何があるの?と言う話になりますが...
四捨五入には実はいろいろな方法があるようです。数年前、Delphi の四捨五入の方法が、一般的によく使用されている下記のような半ば常識とした四捨五入の方法と異なっていることから、Delphi の四捨五入の実装方法である Banker's Rounding (=IEEE754 で規定されている) の内容を調べたことがあります。
その四捨五入の方法とは下記のような仕様でした。

基本的には最も近い整数値に丸めつつも,上下の整数が等しく近い場合には偶数となる方を優先する。
具体的には、丸めたい一つ下の桁を参照して、その数字が4以下であれば切り捨て6以上であれば切り上げする。5の場合は特殊で、1桁上(丸めたい桁)が奇数なら切り上げそうでなければ切り捨てする。

この調べものの際に、Microsoft の丸めを行うカスタム プロシージャを実装する方法を参照したことがあります。
このページにはいろいろな丸めの方法が記載されており、そのコーディング方法も記載されていて非常に参考になりました。
最近また見る機会があったので、知らない人もかなり多かったこともあり、自分のメモがてら載っけておきます。

以下のような、丸めが記載されています。

  • 切り捨て
  • 切り上げ
  • 算術型丸め
  • 銀行型丸め
  • ランダム丸め

また、それぞれに

  • 対称
  • 非対称

が定義されています。

 それぞれ利点があるんでしょうが、あまりデータの中身を検討せずに四捨五入を選択した際には、算術型丸めか銀行型丸めを使用しています。ランダムは使用したことがありません。
この二つの選択基準として、特に指定が無くデータが統計的もしくは科学的用途であった場合には銀行型を、販売管理系などアプリの作成において顧客から特に指定があるときには算術型が指定されているのでそれを選択しています。科学的要素が多い場合は四捨五入による1方向への偏りが問題になるのでしょう。しかし、B2Bの際の四捨五入なんて双方の取り決めだけの話ですし、1円単位の積算誤差なんて取引額に比べればたかが入れている場合が多いので、仕様が簡単で一般的に知られている&確認しやすい算術型なのでしょうね。でも、銀行では偏りが無視できなかったために偏りの無い丸めを採用したんですね。貸す件数よりも預かる件数のほうが圧倒的に多そうですね。圧倒的に件数の違いが発生すると無視出来なさそうです。

何か明確な意識を持って、丸めを選択している。または、丸めでこんなトラブルがあったなど経験談なんかありましたら、コメントでも残してもらえるとうれしいです。

2008-12-02 追記
最近気づいたのですが、Cは算術/対象型なのですね。ISO/IEC C99 で定義されているようです。

トラックバック

このエントリのトラックバックURL:
https://www.blackcat.xyz/trackback.php/060113_round

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。