我想将一个double值打印成一个不超过8个字符的字符串.打印的数字应尽可能多,例如
5.259675
48920568
8.514e-6
-9.4e-12
Run Code Online (Sandbox Code Playgroud)
我试过C++ iostreams和printf-style,并且都没有像我希望的那样尊重提供的大小:
cout << setw(8) << 1.0 / 17777.0 << endl;
printf( "%8g\n", 1.0 / 17777.0 );
Run Code Online (Sandbox Code Playgroud)
得到:
5.62525e-005
5.62525e-005
Run Code Online (Sandbox Code Playgroud)
我知道我可以指定一个精度,但我必须在这里提供一个非常小的精度,以便覆盖最坏的情况.任何想法如何在不牺牲太多精度的情况下强制确切的场宽?我需要这个用于打印矩阵.我真的需要提出自己的转换功能吗?
5年前也提出了类似的问题:将double转换为固定宽度的String,没有令人满意的答案.我当然希望在此期间取得一些进展.
实际上,这看起来并不太困难,尽管您无法通过单个函数调用来完成它。指数使用的字符位置的数量确实很容易预测:
const char* format;
if (value > 0) {
if (value < 10e-100) format = "%.1e";
else if (value < 10e-10) format = "%.2e";
else if (value < 1e-5) format = "%.3e";
}
Run Code Online (Sandbox Code Playgroud)
等等。
只是,定义 printf 行为的 C 标准坚持指数至少有两位数,因此浪费了一些。请参阅C++ 如何使用 printf 获取“一位数字指数”
合并这些修复将使代码相当复杂,尽管仍然不如自己进行转换那么糟糕。