ショボ短歌会

VC++6.0 long型とdouble型の掛け算について

-----------------------------
long lAnser;
long lHoge = 100;
double dHoge = 1.15;

lAnser = lHoge * dHoge;
------------------------------

上記のように演算したところ
lAnserは「114」になりました。
なぜ、「115」にならないのでしょうか?
また、どうすれば「115」になるのでしょうか?

ご教授よろしくお願いします。

A 回答 (2件)

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% …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます

double, float型では正確な計算ができないのですね
勉強になりました。

お礼日時:2005/08/25 00:06

まず、異なる型の演算の場合は「強い」型に統一されます。

「強さ」は
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;
なんていう、似非分数もあります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/08/25 00:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!