2

末尾の 0 や不要な 9 を使用せずに、文字列を 10 進数でフォーマットする関数を作成するにはどうすればよいですか? 小数が 2 であることを考えると、次のようになります。

0.999 -> 1.0
0.99 -> 0.99
1.01 -> 1.01
1.001 -> 1.0
123 -> 123.0
0 -> 0.0
0.1 -> 0.1

(ご想像のとおりマイナス)

これが私がこれまでに持っているものですが、かなり醜いコードです。これを行うより良い方法はありますか?

string toStrMaxDecimals(double value, uint decimals) {
    value *= pow(10, decimals);
    value = round(value);
    value *= pow(0.1, decimals);
    string temp = boost::lexical_cast<string>(value); 
    size_t dot = temp.find('.');
    if (dot != string::npos) {
        if (temp.size() > dot + decimals + 1)
            temp.erase(dot + decimals + 1);
        if (*temp.rbegin() == '0')
            temp.erase(temp.find_last_not_of("0") + 1);
        if (*temp.rbegin() == '.')
            temp.append("0");
    } else {
        temp.append(".0");
    }
    return temp;
}
4

3 に答える 3

5

sprintf は、C++ ストリームよりもはるかに簡単で、読みやすく、パフォーマンスが向上します。自分で丸めたりトリミングしたりする必要はありません。Sprintf にはそのためのフラグがあります。あなたはおそらく次のようなものが欲しい

sprintf(targetBuffer, "%.2g", floatingPointValue);

Sprintf は Java で丸め処理を行いますが、C++ でも同様に行われると確信しています。

編集:

申し訳ありませんが、私が書いたサンプルコードはあなたの例です。元の質問については、 %.2g を %.6g に変更してください

編集:

f を g に変更して、末尾のゼロを抑制しました。

于 2009-05-23T00:11:20.923 に答える
1

単純な古い sprintf を使用して書式設定を行うことを検討しましたか?

必要なことを正確に実行するわけではありませんが、100 分の 1 に丸め、その数値を %f (float の場合) または %lf (double float の場合) として sprintf するとします。

100 分の 1 に丸めるには、
num = num + ((int)(num-((int)num))*100)/100;を実行できます。

于 2009-05-22T22:58:43.787 に答える