
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% …
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;
なんていう、似非分数もあります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- 英語 "as long as"で仮定法は可能なのか、及び、直説法の両方可能な場合の見分け方について 4 2022/08/01 10:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数プロトタイプ無しで、引数...
-
浮動小数点の誤差のあわせ方
-
C++初心者です。簡単なスコア計...
-
DWORDの警告
-
2次方程式の解を求めるプログ...
-
型変換のitoaのaって?
-
カウントアップタイマ
-
2分法で方程式の複数の解を自...
-
関数におけるif文とreturn文に...
-
漸化式のプログラム
-
^この記号を使わない
-
C言語の型による処理速度の違い
-
型指定子についての教えてくだ...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
2÷3などの余りについて
-
三次関数の極値の差からkの値を...
-
Aの値からBの値を除するとは??
-
エクセルのオートフィル?ドラ...
-
「指定されたキャストは有効で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
至急です! マクロ定義で #defi...
-
C言語 関数プロトタイプ宣言の...
-
C言語の型による処理速度の違い
-
2次方程式の解を求めるプログ...
-
関数におけるif文とreturn文に...
-
int とdoubleの比較
-
C++で外積
-
C言語で台形公式を使った二重積...
-
指数の表示
-
(C,C++言語)関数の引数は自動キ...
-
C言語のpow関数の不具合
-
C言語のプログラムで#include<m...
-
数値を指数部と仮数部に分離したい
-
プログラミングでのテイラー展開
おすすめ情報