まさぶんの部屋

copyright by えびぞう

目次

Blog 利用状況

ニュース

  • わんくま同盟
  • 書庫

    ギャラリ

    re: 機械、うそつかない その2

    質問で、四捨五入しているけど 1×0.5=0 になるんですけど・・・

     

    「なぜRound() 関数は「偶数丸め」で、IEEE 754 で標準なんですか」

    という質問に詳しくは答えられませんでした。

     Bankers Rounding(銀行の丸め)と呼ばれている計算方法で

    集計による誤差が「四捨五入」と比べて小さくなることは分かるのですが。

     

    投稿日時 : 2007年6月14日 20:06

    コメントを追加

    # re: re: 機械、うそつかない その2 2007/06/14 20:25 Ognac

    Dim dec1 As Decimal = 1
    Dim dec2 As Decimal = Decimal.Round(CDec(dec1 * 0.5), 0, MidpointRounding.AwayFromZero)
    こんなもんだと説得するのがベストかな。
    習慣に理由は無い気がします。四捨五入は日本方言とか

    # re: re: 機械、うそつかない その2 2007/06/15 0:15 オノデラ

    しかも MidpointRounding.AwayFromZero って 2.0 になってからようやく出てきましたしね。

    このあたりはやはりここが詳しい。
    http://ja.wikipedia.org/wiki/%E7%AB%AF%E6%95%B0%E5%87%A6%E7%90%86

    # re: re: 機械、うそつかない その2 2007/06/15 10:17 まさぶん

    日本も何時か変わるのでしょうか

    >端数がちょうど0.5なら切り捨てと切り上げのうち
    >結果が偶数となる方へ丸める。
    >JIS Z 8401で規則Aとして定められていて、
    >規則B(四捨五入)より「望ましい」とされている。



    # re: re: 機械、うそつかない その2 2007/06/15 10:43 ぽぴ王子

    つい昨日「ここは四捨五入してからマイナス値にしているので
    -1.5は-1じゃなく-2になりますよ」という話をしてきた王子が
    やってきたきたやってきた!

    本来ならば-1.5は-1になるべき…だと思う。
    確か仕様で1.5の四捨五入をしてから、それのマイナス値を表示
    みたいな話になっていて、そのまま作っちゃったからなんですけど。
    1.5(というか四捨五入して2)はそれはそれで使うんで、結果的
    に正しくなっている、というお話でした。
    # C# 1.0 の頃のプログラムなんですが、いま別のところを修正
    # してて、そこはそれを正とするから修正しないという話。

    2.0 だったら、MidpointRounding.AwayFromZero を使っていたかも
    しれないですね。


    > 「なぜRound() 関数は「偶数丸め」で、IEEE 754 で標準なんですか」

    IEEE の偉い人が決めたからさ!とさわやかな笑顔で言えばおk(違

    # re: re: 機械、うそつかない その2 2007/06/15 11:38 まさぶん

    >本来ならば-1.5は-1になるべき

    JIS Z 8401では、負の数は絶対値として丸める
    (-1.5は-2へと丸められる)
    とありますが






    # re: re: 機械、うそつかない その2 2007/06/16 1:29 Ognac

    業務的に赤伝をきるときは、-1 * abs(round(n))が
    ほしいですしね

    # re: re: 機械、うそつかない その2 2007/06/16 11:56 中博俊

    いや。そりゃまずい。
    業務的な赤伝の場合には計算しないことが大事です。

    タイトル
    名前
    URL
    コメント