• ベストアンサー

VC++6.0 long型とdouble型の掛け算

VC++6.0 long型とdouble型の掛け算について ----------------------------- long lAnser; long lHoge = 100; double dHoge = 1.15; lAnser = lHoge * dHoge; ------------------------------ 上記のように演算したところ lAnserは「114」になりました。 なぜ、「115」にならないのでしょうか? また、どうすれば「115」になるのでしょうか? ご教授よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

double型では、1.15という数値は厳密に表すことができません。 計算機内部では"1.1499999999999999"と表現されます。 (浮動小数点型がどのように扱われるかは、参考URLからたどってみてください) すなわち、 lHoge * dHoge はの答えは "114.99999999999999" となります。 小数を含む数値を整数型の変数に代入する際には、小数点以下は切り捨てられますので、 結果 lAnswer には "114" が入ります。 この性質を利用して、計算結果の四捨五入は  lAnswer = lHoge * dHoge + 0.5 という式で可能ですが、誤差の根本解決にはなりません。 誤差が許されない場面では、通常double, float型(浮動小数点型)は使用しません。 このような場面では、多倍長固定小数点を用いることが多いかと思います。(googleでしらべてみてください) でわ。

参考URL:
http://www.google.com/search?num=50&hl=ja&q=%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9+double%E5%9E%8B+%E8%AA%A4%E5%B
noname#59240
質問者

お礼

ご回答ありがとうございます double, float型では正確な計算ができないのですね 勉強になりました。

その他の回答 (1)

  • bacet14
  • ベストアンサー率50% (7/14)
回答No.2

まず、異なる型の演算の場合は「強い」型に統一されます。「強さ」は char<short≦int≦long<float<double だったと思います。 従って lHoge * dHoge はdouble型で計算されることになり、2進数での記録方法からNo.1さんがおっしゃるように114.99999999…みたいな数になります。具体的な値は printf("%.30f", lHoge * dHoge); のようにして見て下さい。有効な桁は16桁程度ですが。 解決方法の第2弾として、dHogeの値が例えば115%のつもりなら lHoge = 100; // 任意の数 dHoge = 115; // パーセンテージ lAnswer = lHoge * dHoge / 100; なんていう、似非分数もあります。

noname#59240
質問者

お礼

ご回答ありがとうございました。

関連するQ&A