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

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

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

Re[6]: Decimal型の情報落ちについて


(過去ログ 91 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■54243 / inTopicNo.1)  Decimal型の情報落ちについて
  
□投稿者/ パウ (1回)-(2010/10/11(Mon) 17:22:33)

分類:[.NET 全般] 

金額計算におけるDecimal型の情報落ちについての質問です。
例えばdec1が1兆円より桁が大きいか、dec2がもっと小さい値の場合、足し込むと
情報落ちが発生しますが、そもそもそんなに大きい値は扱うことは少ない、または
そんなに小さい額は0円と同じだ、という理由などで一般的な金額計算の範囲では
Decimal型の情報落ちについて考慮しなければいけないほどの誤差は出ない、
ということでよろしいのでしょうか?
よろしくお願いします。

Dim dec1 As Decimal = 1000000000000D ' 1兆円

Dim dec2 As Decimal = 0.0000000000000001D '0に近いけど0じゃない円

Dim ans As Decimal = dec1 + dec2

引用返信 編集キー/
■54246 / inTopicNo.2)  Re[1]: Decimal型の情報落ちについて
□投稿者/ Azulean (620回)-(2010/10/11(Mon) 19:01:25)
No54243 (パウ さん) に返信
> Decimal型の情報落ちについて考慮しなければいけないほどの誤差は出ない、
> ということでよろしいのでしょうか?

それを判断するのはあなた、もしくはあなたの上司などではないでしょうか。

情報落ちするということを理解し、作るソフトウェアの仕様や制約として容認できると判断したのであれば、問題ないでしょう。
逆に、大きい数値も小さい数値も生きた情報として残さなければならないという仕様や制約があるのであれば、decimal を単純に使うだけでは足らないのかもしれませんね。
引用返信 編集キー/
■54251 / inTopicNo.3)  Re[2]: Decimal型の情報落ちについて
□投稿者/ パウ (2回)-(2010/10/11(Mon) 21:12:00)
確かに。
色々.NET FrameworkのDecimalについてwebや書籍などでも調べたのですが、
業務系の書籍でもそのままDecimalを使って説明してあるのは、簡素化して
あるのでしょうね。
それほど複雑な金利や利回りの計算をする訳ではないのでどこまで許容範囲
なのか調べることにします。ありがとうございました。
解決済み
引用返信 編集キー/
■54264 / inTopicNo.4)  Re[3]: Decimal型の情報落ちについて
□投稿者/ ミラ (7回)-(2010/10/12(Tue) 12:28:47)
解決済みですが
信頼していたDecimalさんについてなので割り込ませてください

・提示されているコードについて
こちらの環境(Framework2.0)で試したところ

ans = 1000000000000.0000000000000001D

となりましたがこれの何が問題となっているのか
パウさんが提示する問題の本質について詳しく教えてください

・Decimal型の情報落ちについて
私の知ってるものは
Dim dec3 As Decimal = 1
dec3 = dec3 / 3
dec3 = dec3 * 3

dec3 = 0.9999999999999999999999999999D

これ以外にもDecimal型で注意しなければいけないものってあれば教えてください
引用返信 編集キー/
■54267 / inTopicNo.5)  Re[4]: Decimal型の情報落ちについて
□投稿者/ shu (94回)-(2010/10/12(Tue) 13:07:27)
No54264 (ミラ さん) に返信
> ・提示されているコードについて
> こちらの環境(Framework2.0)で試したところ
>
> ans = 1000000000000.0000000000000001D
dec1かdec2の0がたぶん1個足りないのだと思います。
(パウさんが提示されたコードの方)
これはDecimalといえども固定byteデータであり有効範囲という
ものが存在するので、この問題は仕方ないと思います。

これを避けたいのであれば用意された型ではなくinteger配列を利用した
多倍長計算が必要になります。

ただ金額計算で必要とされるのはこんな小さな数字は切り捨てて1兆円として
答えが出るのを望まれることが多いのではないかと思います。



引用返信 編集キー/
■54268 / inTopicNo.6)  Re[5]: Decimal型の情報落ちについて
□投稿者/ ミラ (8回)-(2010/10/12(Tue) 13:36:03)
> これはDecimalといえども固定byteデータであり有効範囲という
> ものが存在するので、この問題は仕方ないと思います。

ありがとうございます理解できました
Decimalの有効桁28〜29を超えた場合に誤差が発生すると言うことですね
dec2の0をもう一つ増やしたところ誤差が発生することが確認できました

ここは勝手な解釈ですが
私の環境では29桁で発生したのですがバウさんの環境では28桁で発生したと言うことですね

解決にします
解決済み
引用返信 編集キー/
■54278 / inTopicNo.7)  Re[6]: Decimal型の情報落ちについて
□投稿者/ パウ (3回)-(2010/10/12(Tue) 19:53:45)
ミラさん、shuさんへ

>となりましたがこれの何が問題となっているのか
>dec1かdec2の0がたぶん1個足りないのだと思います。

わかりにくい文章ですいませんでした。
最初に記載したコードでは情報落ちは発生しません。
二行目の
>例えばdec1が1兆円より桁が大きいか、dec2がもっと小さい値の場合、
の意味は、10兆円以上の桁か、dec2より小さい桁にした場合という意味でした。
なので、ミラさんがdec2の0をもう一つ増やして情報落ちが発生したのは上記と同じになります。
こちらでは28桁で発生したという訳ではありません。

>多倍長計算が必要になります。
任意精度演算(多倍長演算)の検討もしたのですが、自作する必要があり、バグが発生する可能性を生むよりも
計算範囲を絞る方向で検討しようと思っています。
また、近しい将来(遠いかも知れませんが)MicrosoftがBigDecimalの実装を検討しているということなので
これが実現すれば、自分的には.NET Frameworkでの開発に仕様的な不安がなくなるのかなといったところです。





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


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

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

管理者用

- Child Tree -