std::set precision 小数字

问题描述 投票:0回答:1

以下代码是使用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
使用不同的格式输出?对于非常小的数字有特殊处理吗?

c++
1个回答
0
投票

即使我指定了足够的精度,为什么 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
是“截止点”。

© www.soinside.com 2019 - 2024. All rights reserved.