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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.54243 の関連記事表示

<< 0 >>
■54243  Decimal型の情報落ちについて
□投稿者/ パウ -(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
親記事 /過去ログ91より / 関連記事表示
削除チェック/

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

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

    情報落ちするということを理解し、作るソフトウェアの仕様や制約として容認できると判断したのであれば、問題ないでしょう。
    逆に、大きい数値も小さい数値も生きた情報として残さなければならないという仕様や制約があるのであれば、decimal を単純に使うだけでは足らないのかもしれませんね。
記事No.54243 のレス /過去ログ91より / 関連記事表示
削除チェック/

■54251  Re[2]: Decimal型の情報落ちについて
□投稿者/ パウ -(2010/10/11(Mon) 21:12:00)
    確かに。
    色々.NET FrameworkのDecimalについてwebや書籍などでも調べたのですが、
    業務系の書籍でもそのままDecimalを使って説明してあるのは、簡素化して
    あるのでしょうね。
    それほど複雑な金利や利回りの計算をする訳ではないのでどこまで許容範囲
    なのか調べることにします。ありがとうございました。
記事No.54243 のレス / END /過去ログ91より / 関連記事表示
削除チェック/

■54264  Re[3]: Decimal型の情報落ちについて
□投稿者/ ミラ -(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型で注意しなければいけないものってあれば教えてください
記事No.54243 のレス /過去ログ91より / 関連記事表示
削除チェック/

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

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

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


記事No.54243 のレス /過去ログ91より / 関連記事表示
削除チェック/

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

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

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

    解決にします
記事No.54243 のレス / END /過去ログ91より / 関連記事表示
削除チェック/

■54278  Re[6]: Decimal型の情報落ちについて
□投稿者/ パウ -(2010/10/12(Tue) 19:53:45)
    ミラさん、shuさんへ

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

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

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




記事No.54243 のレス / END /過去ログ91より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -