3

double を文字列に変換し、小数点以下 2 桁に丸めたい。1.009 を「1.01」、1.0 を「1」と表示したい。これは私が試したことです:

std::ostringstream oss;
oss << std::fixed << std::setprecision(2) << std::noshowpoint  << 1.0;

width を設定せず、 を指定しても、「1.00」が出力されますstd::noshowpoint。望ましい表現を達成する方法は?

4

2 に答える 2

5

最善の解決策:

inline double twodec(double n) { return floor(n * 100 + 0.5) / 100; }

oss << twodec(1.0) << ' ' << twodec(1.009);

討論

http://www.cplusplus.com/reference/ios/fixed/(イタリック鉱山)から

floatfieldがfixedに設定されている場合、float値は固定小数点表記を使用して書き込まれます。つまり、値は、小数部で、指数部分なしで、小数部で指定された桁数で表されます。

したがって、「修正済み」は機能しません。

そうは言っても、あなたがやりたいことをするために私が考えることができる唯一の方法は次のとおりです。

  • 最初に数値を目的の精度(つまりfloor(n * 100 + 0.5) / 100)に丸めてから、デフォルトの表示を使用します(つまり、固定、科学、または精度を指定しないでください。有効な場合fixedscientific、最初にでクリアしてくださいstd::cout.unsetf(std::ios::floatfield))。
  • ポイントの前後で、表示する数値の最大総数に基づいて精度を動的に設定します(これは精度が指定するものです)。これを行うには、小数点の前の部分が何桁になるかを計算し(おそらく、ログベース10を使用)、2を加算します。
  • 結果をにストリーミングしてから、ostringstream末尾の0と任意の「。」を削除します。(かなり恐ろしい)。
于 2013-02-13T10:24:05.650 に答える