【发布时间】:2021-06-24 06:17:47
【问题描述】:
我想将 12345.0 打印为 0.1235e+05。但是下面的代码给出了 1.23450e+04。有没有办法控制 std::scientific 的格式?
#include <iostream>
#include <string>
#include <sstream>
int main()
{
double a = 12345.0;
std::stringstream s;
s.precision(3);
s << std::scientific;
s << a;
std::cout << s.str() << std::endl;
return 0;
}
输出是
1.235e+04
我也试过这里的代码Print exponential notation with one leading zero with C++,但是四舍五入有问题。如果我将精度设置为 4,它不会四舍五入并给出 0.1234E5 但它应该是 0.1235E5。
有什么解决办法吗?
【问题讨论】:
-
我认为如果你想要准确性,你需要编写自己的转换器,例如见stackoverflow.com/questions/7153979/…
-
@Alan Birtles 我不想要准确度,我想要从 0.12345 到 0.1235 而不是 0.1234 的正确舍入。
-
我确信您会得到看起来正确但在某些情况下会失败(有时非常糟糕)的答案,因为它们会引入舍入错误。我建议打印到具有所需精度的字符串,然后以文本形式将“1.235e+04”后处理为“0.1235e+05”。
-
@chux - 恢复 Monica 它是两次乘法和一次舍入的数字。没有数以百万计的重复计算来累积舍入误差。如果代码只为两次乘法提供舍入误差累积,那么没有人可以做任何事情。
-
"如果我将精度设置为 4,它不会四舍五入并给出 0.1234E5 但它应该是 0.1235E5。"是一个错误的结论。值为 12345.0;输出为“0.1234E5”。该输出肯定是四舍五入的。它只是没有朝着预期的方向转动。对于“四舍五入,与偶数相等”,“0.1234E5”是更好的答案。你期待什么舍入模式?
标签: c++ c++11 format std precision