0

私の問題に対する答えを検索した後、私は尋ねることにしました。

double の値を小数点以下 3 桁に丸める必要があると言われました。

私はこれを使用する必要があります:

os.setf(std::ios::fixed,std::ios::floatfield);
os.precision(3);

だから私はタイプostreamのオブジェクトを作成する必要があることを理解しているので、私はこれを書きました:

ostream os;
os.setf(std::ios::fixed,std::ios::floatfield);
os.precision(3);
double a = 3.12364;
os << a;

しかし、コンパイルエラーがあるので、最初の行を次のように変更しました:

ostream os(NULL);

その後、コンパイラはシャットダウンしましたが、何もしなかったことはわかっています。では、 ostream を使用して値を丸めるにはどうすればよいですか?

私は印刷したくないことに注意してください。cout を使用する必要がない/使用したくない

4

3 に答える 3

1

double を に入れたいと仮定すると、 ( から派生した) をstd::string使用します。std::ostringstreamstd::ostream

ostringstream os;
os.setf(std::ios::fixed,std::ios::floatfield);
os.precision(3);
double a = 3.12364;
os << a;

std::string rounded( os.str() ); // get the result

数学的に丸めたい場合は、

round( a * 1000 ) / 1000

方程式の途中で文字列を使用することは、常に危険信号です ;v) 。

于 2013-01-11T09:10:18.547 に答える
1

結果を文字列に保存したくない場合は、単純な数学を使用できます。

#include <cmath>

float myRound(float input) {
    return input > 0
        ? floor(input * 1000 + 0.5) / 1000
        : ceil(input * 1000 + 0.5) / 1000;
}

ただし、1000 を掛けるとオーバーフローが発生すると、結果が正しくないことに注意してください。C++11 では、 も利用できますstd::round

于 2013-01-11T09:20:54.670 に答える
0

最初: を使用する必要がある場合ostream、double の値を小数点以下 3 桁に四捨五入するのではなく、小数点以下 3 桁で値を表示します。(それを丸めるには、 を使用します round( value * 100 ) / 100。) 次に、通常はオブジェクトを使用せず、 ostreamから派生した型のオブジェクトを使用します 。ostream通常はofstreamまたはostringstreamです。

問題は、この丸められた値を表示する場所です。ファイルで必要な場合は、ofstream;を使用します。文字列で表示する場合 (たとえば、ウィンドウ コンポーネントに配置する場合)、それ ostringstreamは です。標準出力に表示するだけの場合は、出力するだけですcout(これは から派生した型です ostream)。

また、完了したら、フラグと精度を復元することを忘れないでください:setfそしてprecision、基になるストリームに永続的な変更を加えます。

于 2013-01-11T09:54:43.180 に答える