copyright by えびぞう
質問で、四捨五入しているけど 1×0.5=0 になるんですけど・・・
「なぜRound() 関数は「偶数丸め」で、IEEE 754 で標準なんですか」
という質問に詳しくは答えられませんでした。
Bankers Rounding(銀行の丸め)と呼ばれている計算方法で
集計による誤差が「四捨五入」と比べて小さくなることは分かるのですが。
投稿日時 : 2007年6月14日 20:06
Dim dec1 As Decimal = 1 Dim dec2 As Decimal = Decimal.Round(CDec(dec1 * 0.5), 0, MidpointRounding.AwayFromZero) こんなもんだと説得するのがベストかな。 習慣に理由は無い気がします。四捨五入は日本方言とか
しかも MidpointRounding.AwayFromZero って 2.0 になってからようやく出てきましたしね。 このあたりはやはりここが詳しい。 http://ja.wikipedia.org/wiki/%E7%AB%AF%E6%95%B0%E5%87%A6%E7%90%86
日本も何時か変わるのでしょうか >端数がちょうど0.5なら切り捨てと切り上げのうち >結果が偶数となる方へ丸める。 >JIS Z 8401で規則Aとして定められていて、 >規則B(四捨五入)より「望ましい」とされている。
つい昨日「ここは四捨五入してからマイナス値にしているので -1.5は-1じゃなく-2になりますよ」という話をしてきた王子が やってきたきたやってきた! 本来ならば-1.5は-1になるべき…だと思う。 確か仕様で1.5の四捨五入をしてから、それのマイナス値を表示 みたいな話になっていて、そのまま作っちゃったからなんですけど。 1.5(というか四捨五入して2)はそれはそれで使うんで、結果的 に正しくなっている、というお話でした。 # C# 1.0 の頃のプログラムなんですが、いま別のところを修正 # してて、そこはそれを正とするから修正しないという話。 2.0 だったら、MidpointRounding.AwayFromZero を使っていたかも しれないですね。 > 「なぜRound() 関数は「偶数丸め」で、IEEE 754 で標準なんですか」 IEEE の偉い人が決めたからさ!とさわやかな笑顔で言えばおk(違
>本来ならば-1.5は-1になるべき JIS Z 8401では、負の数は絶対値として丸める (-1.5は-2へと丸められる) とありますが
業務的に赤伝をきるときは、-1 * abs(round(n))が ほしいですしね
いや。そりゃまずい。 業務的な赤伝の場合には計算しないことが大事です。
Powered by: Copyright © masabun