我希望按照以下规则打印出 double :
1) No scietific notation
2) Maximum decimal point is 3
3) No trailing 0.
例如:
0.01 formated to "0.01"
2.123411 formatted to "2.123"
2.11 formatted to "2.11"
2.1 formatted to "2.1"
0 formatted to "0"
通过使用. precision(3)和std::fixed,我只能实现规则1)和规则2),但不能实现规则3)
0.01 formated to "0.010"
2.123411 formatted to "2.123"
2.11 formatted to "2.110"
2.1 formatted to "2.100"
0 formatted to "0"
代码示例如下:
#include <iostream>
int main() {
std::cout.precision(3);
std::cout << std::fixed << 0.01 << std::endl;
std::cout << std::fixed << 2.123411 << std::endl;
std::cout << std::fixed << 2.11 << std::endl;
std::cout << std::fixed << 2.1 << std::endl;
std::cout << std::fixed << 0 << std::endl;
getchar();
}
有什么想法吗?
最佳答案
您无法使用 iostream 库的内置格式来执行此操作。
此外,您不需要对每个输出应用固定,因为它不会重置。
您可以编写自己的操纵器来执行此操作:
struct MyFormatter {
int precision;
double value;
MyFormatter(int precision, double value) : precision(precision), value(value) {}
friend std::ostream& operator<<(std::ostream& s, MyFormatter const& v) {
std::stringstream ss;
ss << std::set_precision(v.precision) << std::fixed << v.value;
std::string str;
ss.str().swap(str);
str.resize(str.find_last_not_of("0") + 1);
if (str[str.length() - 1] == '.') str.resize(str.length() - 1);
s << str;
return s;
}
};
struct MyFormat {
int precision;
MyFormat(int precision) : precision(precision) {}
MyFormatter operator()(double value) const {
return MyFormatter(precision, value);
}
};
int main() {
MyFormat f(3);
std::cout << f(0) << ' ' << f(0.1) << ' ' << f(0.12345) << '\n';
return 0;
}
关于c++ - 如何实现以下C++输出格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2475642/