- ベストアンサー
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」になるのでしょうか? ご教授よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
double型では、1.15という数値は厳密に表すことができません。 計算機内部では"1.1499999999999999"と表現されます。 (浮動小数点型がどのように扱われるかは、参考URLからたどってみてください) すなわち、 lHoge * dHoge はの答えは "114.99999999999999" となります。 小数を含む数値を整数型の変数に代入する際には、小数点以下は切り捨てられますので、 結果 lAnswer には "114" が入ります。 この性質を利用して、計算結果の四捨五入は lAnswer = lHoge * dHoge + 0.5 という式で可能ですが、誤差の根本解決にはなりません。 誤差が許されない場面では、通常double, float型(浮動小数点型)は使用しません。 このような場面では、多倍長固定小数点を用いることが多いかと思います。(googleでしらべてみてください) でわ。
その他の回答 (1)
- bacet14
- ベストアンサー率50% (7/14)
まず、異なる型の演算の場合は「強い」型に統一されます。「強さ」は 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; なんていう、似非分数もあります。
お礼
ご回答ありがとうございました。
お礼
ご回答ありがとうございます double, float型では正確な計算ができないのですね 勉強になりました。