2

私はしばらく探しましたが、ここで答えを見つけることができませんでしたが、それは一種の奇妙な質問のようです. C++ で fstream ライブラリを使用しています。私がやろうとしているのは、入力ファイルからデータを取得し、それに変数を割り当て、これを画面と出力ファイルの両方に出力することです。これはすべて、自動車ローンの毎月の支払いを計算する私が取り組んでいるプロジェクトのためのものです。変数がそのままの名前になっているのはそのためです。

私のデータファイルは次のようになります。

105670.00 12345.00 0.057 4

そして本質的に何が起こっているかというと、最初の2つの数字の小数点以下のすべてを失っています(小数点として何を入れたかに関係なく)が、3番目の数字には起こりません。さらに、最初の 2 つの数値の精度 (2) を設定しようとすると、コードの後に​​表示される奇妙な論理エラーが発生します。

私のコードは次のようになります。
#include<fstream>
#include<iomanip>
#include<iostream>
using namespace std;

int main ()
{
ifstream din; // These are my input and output files
ofstream dout;
float purchasePrice; // The first number of the input file.
float downPayment; // Second number.
float annualInterest; // Third number.
float numYears; // Last number.

// declaring the input/output files code here

din >> purchasePrice >> downPayment >> annualInterest >> numYears;

cout << purchasePrice << endl;
cout << downPayment << endl;
cout << annualInterest << endl;
cout << setprecision(2) << purchasePrice << endl;
cout << setprecision(2) << downPayment << endl;
cout << setprecison(2) << annualInterest << endl;
}
ここに私の出力があります:

105670 12345 0.057 1.1e+005 1.2e+004 0.057

出力を次のようにします。

105670.00 12345.00 0.057 105670.00 12345.00 0.05

さらに、計算を実行すると、数字は小数点以下のすべてが残っているかのように動作します。私の質問は、なぜフロートの一部だけが切り捨てられるのか、この場合に setprecision() が期待どおりに機能しないのはなぜですか?

どんな回答でも大歓迎です。長い説明で申し訳ありません。

4

2 に答える 2

3

fmtflagsを に設定する必要もありますfixed

std::cout << std::fixed << std::setprecision(2) << purchasePrice << "\n";

scientificorを指定しないfixedと、出力メカニズムは最適と見なされるスキームを使用します。何が「ベスト」かはご存知のとおり、それは固定小数点方式です。詳細については、http://en.cppreference.com/w/cpp/io/manipを参照してください。

さらに良いのは、お金を扱うときに浮動小数点数をまったく使用しないことです。固定小数点演算パッケージを使用する方がはるかに優れています。

于 2012-10-31T16:18:37.900 に答える
0

float は一般に 24 バイナリ ビットの精度を持ちます。つまり、10 進数で約 6 桁の精度を格納できるため、数値が 100000 より大きい場合、10 進数の精度はまったく得られません。

この場合、 floatの代わりに約 15 桁の精度を持つdoubleを使用する必要があります。

それはあなたの特定の質問に答える可能性が最も高いですが、これがお金のためである場合、たとえば値として0.01を正確に表すことができないため、おそらくフローティング形式を使用しないでください。したがって、すべての計算は概算であり、おそらくお金を扱うときはそれを望んでいません。一般に、ペンス/セント/その他の数値を整数で保持し、注意してください:)または、丸めなどに関する法的要件がしばしばあるため、お金の値を処理するために特別に設計されたクラスの方が適しています.

于 2012-10-31T16:23:17.293 に答える