1

この質問は数回尋ねられましたが、すべての回答は sprintf を参照しているか、末尾のゼロを手動で削除する必要があります。本当に良い方法はありませんか?でこれを達成することはできませんstd::stringstreamか?

4

2 に答える 2

4

まず、小数点以下の桁数を計算します。

int digits_before = 1 + (int)floor(log10(fabs(value)));
int digits_after = std::numeric_limits<double>::digits10 - digits_before;

次に、それらの桁のうち何桁がゼロであるかを調べます。

double whole = floor(pow(10, digits_after) * fabs(value) + 0.5);
while (digits_after > 0 && (whole/10.0 - floor(whole/10.0)) < 0.05)
{
    --digits_after;
    whole = floor(whole / 10.0 + 0.5);
}
if (digits_after < 0) digits_after = 0;

これで、で使用できる値が得られましたstd::setprecision

std::stringstream ss;
ss << std::fixed << std::setprecision(digits_after) << value;

最終的に、これは多くの作業であり、とにかく文字列変換が行う労力が重複します。そのため、人々は通常、文字列に変換して末尾のゼロを削除するだけです。いいえ、これを行うための簡単な書式設定オプションはありません。難しい方法で行うか、まったく行わない必要があります。

上記のコードの動作を参照してください: http://ideone.com/HAk55Y

于 2014-03-04T17:27:07.040 に答える
-1

目標がx後続ゼロの固定小数点以下にすることである場合は、固定 sstream を介して double を投げます。その後、出力が固定されていない残りの部分を切り取ります。

double number = 1.03000;
std::stringstream s.precision(6);

s << number;
std::cout << s.str();

編集:結果を保存するには

std::string result = s.str();
于 2014-03-04T16:54:47.873 に答える