如果你这样做
double number;
cout.precision(3)
cout<<number;
对于像1.23456这样的数字你得到1.234但是如果数字是1.2则得到1.200。如何同时获得1.234和1.2(它们是无用的零)?假设您不知道要打印的号码。
答案 0 :(得分:4)
#include <iostream>
#include <iomanip>
using namespace std;
auto main() -> int
{
cout << setprecision( 4 );
cout << 1.23456 << endl; // -> "1.235"
cout << 1.2 << endl; // -> "1.2"
}
就是这么简单:这是你默认得到的。
在设置fixed
或scientific
后,C ++ 03缺少用于重置为默认格式的操纵器。但是,在C ++ 11中引入了 defaultfloat
操纵器。您可以像这样使用它:
#include <iostream> // defaultfloat
#include <iomanip> // setprecision
using namespace std;
#ifdef __GNUC__ // Also check for version number, e.g. 4.8.2 and earlier
namespace std {
inline
auto defaultfloat( ios_base& stream )
-> ios_base&
{ stream.unsetf( ios_base::floatfield ); return stream; }
}
#endif
auto main() -> int
{
cout << "Lots of digits: " << fixed << setprecision( 16 ) << 1.2 << endl;
cout << endl;
cout << "Deault presentation:" << endl;
cout << defaultfloat;
cout << 1.234 << endl;
cout << 1.2 << endl;
}
答案 1 :(得分:0)
您可以编写一个操纵器来实现格式化:
#include <cmath>
#include <iostream>
template <typename T>
struct DecimalPrecision
{
const T& value;
const unsigned decimals;
DecimalPrecision(const T& value, unsigned decimals)
: value(value), decimals(decimals)
{}
void write(std::ostream& stream) const {
std::ios_base::fmtflags flags = stream.flags();
stream.unsetf(std::ios_base::floatfield);
std::streamsize restore
= stream.precision(std::ceil(std::log10(std::abs(value))) + decimals);
stream << value;
stream.precision(restore);
stream.flags(flags);
}
};
template <typename T>
inline DecimalPrecision<T> decimal_precision(const T& value, unsigned decimals) {
return DecimalPrecision<T>(value, decimals);
}
template <typename T>
inline std::ostream& operator << (std::ostream& stream, const DecimalPrecision<T>& value) {
value.write(stream);
return stream;
}
#include <iomanip>
int main()
{
std::cout << std::setprecision(2);
double values[] = { 12345.6789, 1.23456789, 1.2 };
for(unsigned i = 0; i < sizeof(values)/sizeof(values[0]); ++i)
std::cout
<< i << ": " << values[i] << '\n'
<< " " << decimal_precision(values[i], 2) << '\n';
}
答案 2 :(得分:0)
您甚至尝试过自己的示例吗? 尾随零号不打印(默认情况下)。
实际上,一个人通常想要(!)那些零(它们传达信息,并且它们避免破坏输出)。 这是通过cout << std :: fixed实现的。
除非您使用过std :: fixed,否则即使精度高于2,1.2也会产生1.2,而不是1.200。
顺便说一句:精度表示所有数字,而不仅仅是点之后的数字,因此precision = 3导致1.23-除非您输入std :: fixed,否则仅对点之后的那些数字进行计数。