如果你爲一些做C++如何避免尾隨零?
double number;
cout.precision(3)
cout<<number;
像1.23456你得到1.234但如果人數是1.2,你得到1.200。如何獲得1.234和1.2(他們是無用的零)?假設你不知道你要打印什麼號碼。
如果你爲一些做C++如何避免尾隨零?
double number;
cout.precision(3)
cout<<number;
像1.23456你得到1.234但如果人數是1.2,你得到1.200。如何獲得1.234和1.2(他們是無用的零)?假設你不知道你要打印什麼號碼。
#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中引入了機械手。您可以使用它像這樣:
#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.23456應該被剪裁(雖然我認爲他沒有意識到它會導致1.235,但除此之外),而1.2應該簡單地「成爲」。 – WhozCraig
你是認真的嗎?我只是舉了一些例子,然後我說你不知道你打算打印哪個數字,因爲它們是變量。 它的變量值是1.23456你不能這樣做,因爲你沒有得到1.234 – user3290180
當你把他的示例輸入「1.23456」並改變時,我看不到這是「默認情況下得到的結果」它的目的是爲了你的答案「1.234」。 –
你可能會寫一個機械手,實現您的格式:
#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';
}
我不認爲這是你應該「避免」。如果我們談論精度,那麼1.200中的零不是「無用的」。這聽起來像你想要一個舍入函數,而不是一個精確函數。 –
也許我錯過了一些東西,但[**這不*做你想要的**](https://ideone.com/GgsVCh)?你使用的是什麼版本的C++(並且工具鏈信息也會被讚賞)? – WhozCraig
是的,我想要一個舍入函數,但也要截斷 – user3290180