2017-11-12 51 views
2

私は、最大10の小数点以下の桁数をC++でdouble値を文字列化したいので、私はしかしC++で小数点以下1桁以上を印刷しますか?

std::stringstream s; 
double value = 3.1415926; 
s << "value is " << std::setprecision(10) << value; 

のようなものを使用し、valueは、4.0などの一部の正確な整数値を持っている場合、私はそれが4.0ないを印刷したいですちょうど4。 C++ stringstream、または旧式のsnprintf()のいずれかでこれを実現する方法はありますか?

これまでのところ、私は考えることができる唯一のソリューションは、floor(value)valueを比較することです:

std::stringstream s; 
if (floor(value) == value) 
    s << std::setprecision(1) << std::fixed << value; 
else 
    s << std::setprecision(10) << value; 

私がしなければならない場合、私は、そのソリューションをおこうが、私はいくつかを見下ろすだ場合、私は好奇心が強いです私は条件付きを避けることができるiostreamガジェット。

答えて

1

使用std::fixed

s << "value is " << std::fixed << std::setprecision(10) << value; 

Live Demo


更新:私はあなたが探しているものを読み違えると思います。 std::fixedだけでは、整数の精度1と小数の精度10を使用して、解決しようとしている問題には対応していません。あなたは、例えば、(簡単にするために、私は無限とはNaNを無視していますが、あなたの実際のコードでそれらを占めていることを確認します)それらの間を区別するためにstd::modf()を使用することができます。

#include <cmath> 
std::stringstream s; 
double integral; 
if (std::modf(value, &integral) == 0) 
    s << std::fixed << std::setprecision(1) << integral; 
else 
    s << std::fixed << std::setprecision(10) << value; 
+0

私ので、私は、あなたの答えで混乱していました私自身の条件付き解決法で 'std :: fixed'を使っています。しかし、関係なく、私はあなたの "ライブデモ"をチェックしただけで、目的の出力を生成していません。 '4.0000000000'ではなく' 4.0'(正確な積分値の特殊な場合)を出力する必要があります。 –

+0

@ RyanV.Bissellあなた自身の質問に答えました。精度を条件付きで設定する必要があります。 –

+0

それでは、誰かが「」や「」のツールがあなたの目標を直接達成するのであれば、それを条件付きでやり直す必要があります。私はそれを受け入れます。 –

関連する問題