точность — C ++, как избежать конечных нулей?

Если вы делаете

double number;
cout.precision(3)
cout<<number;

для числа, подобного 1.23456, вы получаете 1.234, но если число равно 1.2, вы получаете 1.200. Как получить как 1.234, так и 1.2 (они бесполезные нули)? Предположим, вы не знаете, какое число вы должны напечатать.

0

Решение

#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"}

Это так просто: это то, что вы получаете по умолчанию.


В C ++ 03 отсутствовал манипулятор для сброса настроек по умолчанию после настройки fixed или же scientific, Однако в 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;
}
4

Другие решения

Вы могли бы написать манипулятор для достижения вашего форматирования:

#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';
}
0

По вопросам рекламы [email protected]