DOBON.NET DOBON.NETプログラミング掲示板過去ログ

小数点を含む掛け算で計算結果が丸められるのは何故?

環境/言語:[VB.NET]
分類:[.NET]

いつもお世話になっております。

小数点を含む下記の計算で、結果が思うように得られません。
基本的な様な気がしてお恥ずかしい質問かもしれませんが
なかなか解決できなく投稿させていただきました。
どうかよろしくお願いいたします。

Dim dat1 As Decimal = 1200
Dim dat2 As Decimal = 96
Dim dat3 As Decimal = 136
Dim dat4 As Decimal = 119

dat2 = dat2 / 100 '0.96
dat3 = 100 / dat3 '0.7352941
dat4 = dat4 / 100 '1.19

    '計算結果が1008.00...となります…。
    '本当は1007.9999...という結果を得たいのです。
TextBox1.Text = (dat1 * dat2 * dat3 * dat4).ToString
こんにちは、じゃんぬ です。

■No11494に返信(イナフさんの記事)
> 小数点を含む下記の計算で、結果が思うように得られません。
> 基本的な様な気がしてお恥ずかしい質問かもしれませんが
> なかなか解決できなく投稿させていただきました。

有効小数桁数には限界があります。

> dat3 = 100 / dat3 '0.7352941

この dat3 がかなり曲者。

>     '計算結果が1008.00...となります…。
>     '本当は1007.9999...という結果を得たいのです。
> TextBox1.Text = (dat1 * dat2 * dat3 * dat4).ToString

で、大切なのは計算順序。

TextBox1.Text = ((dat1 * dat3) * (dat2 * dat4)).ToString() とすると結果が変わります。

さて、何故でしょう? (それが、答えです)
ノ<横からチラッ…と
>> dat3 = 100 / dat3 '0.7352941
> この dat3 がかなり曲者。
ココ…SDKのヘルプ見ても、
整数リテラル"/"[decimal]の時の、リテラルの型が分からなくて困っていました(ぇ
多分ここで…ということかな…?

※でゎ、失礼しましたー>(´Д` )
皆さんご回答ありがとうございました。

> 有効小数桁数には限界があります。
ある一定の小数点桁数になると整数に丸められるということでしょうか?

> この dat3 がかなり曲者。
> TextBox1.Text = ((dat1 * dat3) * (dat2 * dat4)).ToString() とすると結果が変わります。
確かに正しい結果が得られました。が、まだ理解できておりません…。
もうすこし調べてからお聞きしたいと思います。
また、試しに型をDoubleにしたらまた、駄目な結果になるんですね…。
こんにちは、じゃんぬ です。

■No11497に返信(イナフさんの記事)
> 確かに正しい結果が得られました。が、まだ理解できておりません…。
> もうすこし調べてからお聞きしたいと思います。

今回、最後の積算についてだけお聞きしたいのかと思い、色々端折りました。
計算順序によって、"途中の計算結果" の小数点の精度が変わるのはわかりますよね?

なので、精度を意識した計算順序、もしくは、一時的に小数部を無くしたりと色々手法はありますよね。

DOBON.NET | プログラミング道 | プログラミング掲示板