この関数を使用して、f
のdouble型を小数点以下のp
桁の文字列に変換しています。doubleを文字列に挿入するときの丸めを避ける
static std::string doubleToString(double f, int p)
{
std::stringstream ss;
ss << std::fixed << std::setprecision(p) << f;
std::string s = ss.str();
s.erase(s.find_last_not_of('0') + 1, std::string::npos);
return (s[s.size()-1] == '.') ? s.substr(0, s.size()-1) : s;
}
最後に残っている0が消去されます。たとえば、1.23000
は1.23
となります。
入力:
double test1 = 1;
double test2 = 1.12345678;
double test3 = 1.123456789010;
std::cout << doubleToString(test1, 8) << " " << doubleToString(test2, 8) << " " << doubleToString(test3, 8);
出力:
1 1.12345678 1.12345679
あなたはtest1
とtest2
が細かい印刷されて見ることができるように。しかし、test3
は8番目の数字の後に丸められます。私はそれを避け、数字の残りの部分を "切り捨て"したいので、doubleToString(1.123456789010, 8)
は1.12345678
を返します。
これを行う最も効果的な方法は何ですか?
doubleToString((test3 - (0.5/(pow(10, 8)))), 8)
それは透明な溶液ではないですが、あなたが欲しいものを行う必要があります。
あなたは '.'を探して、' <位置の後にすべてをカットしてみませんか? > + 8 '? – GMichael
8桁目の正確な値に依存しているのに浮動小数点型を使用する理由がありますか? –
@GMichael私はこの行で丸めが起こっていると思います: 'ss << std :: fixed << std :: setprecision(p)<< f;'。その前に、私は文字列を持っていないので、 "。"を探すことができます。その後、文字列の長さはすでに 'p'です。 @ワーレンPそう、理由がある。正確で浮動小数点でなければなりません。 – Bobface