どんな優雅にフォーマット文字列はC++では四捨五入6桁、追加の"0または'9の整

StackOverflow https://stackoverflow.com/questions/900326

質問

うような関数を書くのにフォーマット文字列の小数桁数を、末尾の0は不要です9。この部で"年"、小数部で"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;
}
役に立ちましたか?

解決

std::string toStrMaxDecimals(double value, int decimals)
{
    std::ostringstream ss;
    ss << std::fixed << std::setprecision(decimals) << value;
    std::string s = ss.str();
    if(decimals > 0 && s[s.find_last_not_of('0')] == '.') {
        s.erase(s.size() - decimals + 1);
    }
    return s;
}

他のヒント

はsprintfは、C ++のストリームよりもはるかに容易に、より読みやすく、よりパフォーマンスになるだろう。あなたはどの丸めたり自分でトリミングをする必要はありません。 sprintfのは、そのための旗を持っています。あなたは、おそらくのような何かをしたい。

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

はsprintfは、Javaで丸めを行い、そして私はそれが同様にC ++になりますかなり確信しています。

EDITます:

申し訳ありませんが、私が書いたコード例では、あなたの例のためです。あなたの元の質問については、%0.6グラム

に%の0.2グラムを変更

EDITます:

ゼロを末尾抑制するG Fに変更します。

ている平野の古いsprintfのフォーマット?

こんに何が必要かを正確には、そのまま丸一hundredths、そのsprintfの数%f(float)または%lf(ダブル用します。

丸100'thsすい
num=num+((int)(num-((int)num))*100)/100;

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top