C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[48]: 四捨五入でバグ発見 [3]


(過去ログ 49 を表示中)

[トピック内 65 記事 (61 - 65 表示)]  << 0 | 1 | 2 | 3 >>

■27064 / inTopicNo.61)  Re[44]: 四捨五入でバグ発見
  
□投稿者/ みきぬ (178回)-(2008/10/27(Mon) 10:30:28)
2008/10/27(Mon) 10:40:25 編集(投稿者)

No27054 (Jitta さん) に返信
> パッと思ったのは、小数点以下3桁目で四捨五入なら、まず小数点以下4桁目を四捨五入しておいて、それから3桁の四捨五入を行うのかなぁ〜?
> (σ(・_・)知識として誤差は知っているけど、実際に誤差で苦しんだことのない、幸せな人)

だめでした。

Console.WriteLine(Math.Round(Math.Round(555.555, 3, MidpointRounding.AwayFromZero), 2, MidpointRounding.AwayFromZero))

(結果)
555.55

----- 以下、乱暴な証明
Math.Round(Math.Round(555.555, 3, MidpointRounding.AwayFromZero), 2, MidpointRounding.AwayFromZero)
= Math.Round(555.555, 2, MidpointRounding.AwayFromZero)
= 555.55

引用返信 編集キー/
■27085 / inTopicNo.62)  Re[45]: 四捨五入でバグ発見
□投稿者/ Jitta on the way (202回)-(2008/10/27(Mon) 19:01:28)
No27064 (みきぬ さん) に返信
> 2008/10/27(Mon) 10:40:25 編集(投稿者)
>
> ■No27054 (Jitta さん) に返信
>>パッと思ったのは、小数点以下3桁目で四捨五入なら、まず小数点以下4桁目を四捨五入しておいて、それから3桁の四捨五入を行うのかなぁ〜?
>>(σ(・_・)知識として誤差は知っているけど、実際に誤差で苦しんだことのない、幸せな人)
>
> だめでした。
ダメなことは自明でしたね(苦笑)
.555 が表現出来ないのだから、.5549 を double 以外にしてからでないと、また .5549 に戻ってしまう...
引用返信 編集キー/
■27087 / inTopicNo.63)  Re[46]: 四捨五入でバグ発見
□投稿者/ ラウンドワン (10回)-(2008/10/27(Mon) 20:36:24)
そのDoubleをDecimalに変換のときに
近似値は常に期待した値になるのかな?
常に、.5549 は.555になるのだろうか?????
引用返信 編集キー/
■27099 / inTopicNo.64)  Re[47]: 四捨五入でバグ発見
□投稿者/ みきぬ (181回)-(2008/10/28(Tue) 09:46:47)
No27087 (ラウンドワン さん) に返信
> そのDoubleをDecimalに変換のときに
> 近似値は常に期待した値になるのかな?
> 常に、.5549 は.555になるのだろうか?????
>

(サンプルコード)
Dim dbl As Double = 555.555
Console.WriteLine("double " & dbl & " -> " & Math.Round(dbl, 2, MidpointRounding.AwayFromZero))

Dim dec As New Decimal(dbl)
Console.WriteLine("decimal " & dec & " -> " & Math.Round(dec, 2, MidpointRounding.AwayFromZero))

(実行結果)
double 555.555 -> 555.55
decimal 555.555 -> 555.56

ここにある説明より引用:
http://msdn.microsoft.com/ja-jp/library/system.double.aspx
引用 -----
  Double 値に含まれる有効桁数は 15 桁ですが、内部的には最大 17 桁が保持されています。
  浮動小数点数の桁数から、複数の結果が生成されます。
----------

ここにある説明より引用:
http://msdn.microsoft.com/ja-jp/library/9d9dyd10.aspx
引用 -----
  このコンストラクタは、value を有効桁数 15 の近似値に丸めます。
  数値が 15 桁を超える場合でもこの丸めが行われ、15 桁より下位の桁は 0 になります。
----------

それと MSIL を覗いた結果から考えるに、
・double として 555.555 を格納しようとすると、実際には近似値として 555.55499999999995 (17桁)が保持される。
・それを double から decimal に変換するときに、555.55499999999995 を有効桁数15桁で端数処理した結果、 555.555 という decimal 値が格納される

という感じなので、(decimalとしてオーバーフローしなければ)常に期待通りになると考えていいのかなぁ?

(考察)
・double から decimal にするのに、decimal のコンストラクタを使ったが、別のやり方だとどうなるかは未検証。
・decimal にしたときに、なんで 555.555000000000 じゃなくて 555.555 になったんだろう?



引用返信 編集キー/
■27121 / inTopicNo.65)  Re[48]: 四捨五入でバグ発見
□投稿者/ ラウンドワン (11回)-(2008/10/28(Tue) 12:11:15)
みなさまありがとうございます
とても勉強になりました、
とりあえず、私の疑問は解決ておりますので
解決済みとさせていただきます

解決済み
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 | 2 | 3 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -