以下代码是使用VS2022编译的
#include <iostream>
#include <iomanip>
int main()
{
double d1 = 0.0006;
double d2 = 0.00006;
double d3 = 1.0006;
double d4 = 1.00006;
std::cout << "d1=" << std::setprecision(9) << d1 << "\n";
std::cout << "d2=" << std::setprecision(9) << d2 << "\n";
std::cout << "d3=" << std::setprecision(9) << d3 << "\n";
std::cout << "d4=" << std::setprecision(9) << d4 << "\n";
return 0;
}
输出是
d1=0.0006
d2=6e-05
d3=1.0006
d4=1.00006
我试图了解
std::setprecision
的工作原理(不使用 std::fixed
)。
为什么即使我指定了足够的精度,
d2
仍使用科学格式输出?
为什么
d2
和d4
使用不同的格式输出?对于非常小的数字有特殊处理吗?
即使我指定了足够的精度,为什么 d2 仍以科学格式输出?
默认情况下https://en.cppreference.com/w/cpp/locale/num_put/put使用%g,如https://en.cppreference.com/w/cpp/io/c/fprintf .
如果非零,则令 P 等于精度;如果未指定精度,则令 P 等于精度;如果精度为 0,则令 P 等于精度。那么,如果使用 E 类型的转换将具有 X 的指数:
- 如果 P > X ≥ −4,则转换采用样式 f 或 F 且精度为 P − 1 − X。
- 否则,转换的格式为 e 或 E,精度为 P − 1。
精度为
P=9
。数字是 6e-5
,所以指数是 X=-5
。 P > X ≥ −4
为假,因为指数 -5
低于 -4
。因此,转换是通过 %e
完成的,它以“e”xponent 表示法打印。
为什么d2和d4使用不同的格式输出?
参见上面的规则,数字的指数在
9
和 -4
之间。
对于非常小的数字有特殊处理吗?
一般来说,是的 -
e-4
是“截止点”。