ドルでおつりを計算するプログラムをC++で書きましたが、時々1セント少なくなって
しまいます。おつり計算の時は正しいのですが、結果(double) を intにアサインする時にそうなってしまいます。どうすれば正しく動くようになるのかわかりましたら、教えてください。よろしくお願いします。コンパイラーはマックのg++を使用しています。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
//declare variables
doubleamountOwes = 0.0;
doubleamountPaid = 1.0;
doubleamountOfChange = 0.0;
intnumberOfDollars = 0;
intcents = 0;
cout << fixed << setprecision(2);
for (amountOwes = 0.0; amountOwes < 1.00; amountOwes = amountOwes + 0.01) {
amountOfChange = amountPaid - amountOwes;
if (amountOfChange >=0 ) {
numberOfDollars = (int) amountOfChange;
cents = (int) (100.0 * (amountOfChange - (double) numberOfDollars));
cout << "Paid $"<<amountPaid<< " Owes $"<<amountOwes<< " ";
cout << "change "<<100 * (amountOfChange - numberOfDollars)<< " cents ";
cout << "cents= " << cents << " cents\n";
}
}
//system ("pause");
return 0;
} //end of main function
No.6
- 回答日時:
そういえば、Macでは使えたかどうか忘れましたが、GCCは_Decimal64とか_Decimal128といった10進浮動小数点型をサポートしていますね。
C++ではなく、Cでなければ使えなかったと思いますが...
No.5
- 回答日時:
厳密に言えば「浮動小数点を使う」のがご法度ではなく「10進でない表し方を使う」のがご法度では>#4. 浮動小数であっても 10進で
あればさほど問題ないはず. TR 24733 が現在進行中ですね.No.4
- 回答日時:
C++ に限りませんが、金額などを扱う場合、浮動小数点を使うことはご法度です。
しかし、C++ では固定小数点はサポートされていませんので、工夫する必要が出てきます。詳しい人なら自分で固定小数点クラスを作るのもいいですが、昔から使われているのは、long などで、内部的には 1000 倍(1000 の必要はありませんが)にして持たせる、などです。ただし、扱う金額を 1000 倍しても long の範囲で収まることが条件です。内部では 1000 倍した値で各種計算を行い、最終的に元の桁に戻します。延々と除算を繰り返すようなことをやると丸めが積み重なっていきますが、倍数を大きくすればするほど、その丸め誤差は小さくなってはいきます。
No.3
- 回答日時:
因みに、2進数化すると
0.1=0.000110011001100110011001100110011001100110011001100110011001100110...
0.01=0.000000101000111101011100001010001111010111000010100011110101110000...
と言う循環少数になります。
循環部分を [] で表すと
0.1=0.0[0011]...
0.01=0.00[00001010001111010111]...
となります。
コンピュータのメモリは有限ですから、無限に続く循環少数を正確に表す事は出来ません。
No.2
- 回答日時:
0.1、0.01は、double、float等に2進数化すると「循環少数」になる為、必ず誤差が出ます。
なので、0.1、0.01を扱う場合は、BCD(二進化十進数)を用いるか、固定小数点を用いねばなりません。
これは、C++に限った話ではありません。どんな言語でも同じです。
「セントを1として、すべて整数型で扱う」のも「固定小数点」と同義です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
16進数 加算 減算 C言語
-
O(n log n)について2
-
三菱シーケンサ(Aシリーズ)で...
-
EXCELの関数"STDEV(標準偏差)"...
-
浮動小数点数を10進表記するア...
-
ExcelでPC(パソコン)によって...
-
Excel VBAでの数値の計算につい...
-
floatの有効桁数
-
C言語プログラミングにて、arct...
-
三角比の俯角の計算
-
VBAでミリ秒まで出力する方法
-
VB6.0での小数点の扱いについて
-
パソコンで階乗を計算
-
c languageで 簡単な質問があ...
-
ftoa関数の作成
-
時刻の比較
-
VBAでの割り算の余りの求め方
-
ExcelのINT関数の計算結果がお...
-
0.1の10000回の累積
-
4096bitを95種類で表現すると何...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
三角比の俯角の計算
-
c languageで 簡単な質問があ...
-
16進数 加算 減算 C言語
-
ExcelでPC(パソコン)によって...
-
VB.net Double と...
-
”/”を使わずに割り算したいんで...
-
ExcelのINT関数の計算結果がお...
-
有効数字について 以前質問をし...
-
floatの有効桁数
-
三菱シーケンサ(Aシリーズ)で...
-
距離から緯度経度を求める方法
-
VBAでミリ秒まで出力する方法
-
EXCELの関数"STDEV(標準偏差)"...
-
除算を使わずに10で割りたい。
-
C言語プログラミングにて、arct...
-
VB6.0での小数点の扱いについて
-
VBAでの割り算の余りの求め方
-
255の2の補数、B'00000001'が-...
-
変換指定子%22-16gの表示...
おすすめ情報