C++中,在默认情况下,std::cout 打印 double 类型的数值时不会显示所有精度。为了显示 double 类型的全部有效数字,需要使用 头文件中的 std::setprecision 和 std::fixed 或 std::scientific。

1、基本用法

std::setprecision(17) 设置浮点数输出的精度为 17 位(double 的有效数字约为 15~17 位)。不加 fixed 时输出的是科学计数或自动格式(默认行为)。

#include <iostream>
#include <iomanip>  // std::setprecision

int main() {
    double pi = 3.141592653589793238462643;

    std::cout << std::setprecision(17) << pi << std::endl;

    return 0;
}

2、fixed 与 scientific 模式

std::fixed 使用小数点后精度(保留小数点后 N 位),std::scientific 使用科学记数法格式。fixed 模式下,setprecision 控制的是小数点后的位数。

#include <iostream>
#include <iomanip>

int main() {
    double num = 123.456789123456789;

    std::cout << std::fixed << std::setprecision(15) << num << std::endl;

    return 0;
}

3、输出 double 的推荐做法(完整精度)

std::numeric_limits::digits10 返回 double 类型在十进制下的最大有效数字位数(通常为 15),再加 1,可以保证输出不损失精度。

#include <iostream>
#include <iomanip>

int main() {
    double value = 0.1234567890123456789;

    std::cout << std::setprecision(std::numeric_limits<double>::digits10 + 1)
              << value << std::endl;

    return 0;
}

可以使用 std::defaultfloat 重置 cout 的浮点格式状态:std::cout << std::defaultfloat;

4、使用场景

使用场景

原因 / 目的

推荐用法

精确显示数值结果(如 π、e 等)

科学计算/数学建模中需要精确显示常数值

std::setprecision(17)

比较浮点值前的调试输出

打印所有小数位,避免因精度丢失导致误差

std::setprecision(17)

(不加 fixed

导出数值到 CSV/日志

导出用于进一步分析的精度数据

std::fixed + std::setprecision(15)

金融、货币计算

显示保留 2~4 位小数的金额值

std::fixed + std::setprecision(2)

科学计数法格式输出

输出极大或极小的数值(如概率)

std::scientific + std::setprecision(n)

序列化为字符串保存浮点精度

保证精度还原如二进制数据时的精确性

std::setprecision(std::numeric_limits::digits10 + 1)

1) 数值计算中展示完整精度

#include <iostream>
#include <iomanip>  // 引入 std::setprecision
#include <cmath>    // 引入 M_PI 或自定义计算函数

// 模拟一个 π 的计算函数
double compute_pi() {
    return 3.141592653589793238;  // 示例:手动返回高精度 π 值
}

int main() {
    double result = compute_pi();

    std::cout << "默认精度输出: " << result << std::endl;

    // 使用 setprecision(17) 输出全部有效精度

}

2)金融金额保留两位小数

#include <iostream>
#include <iomanip>  // 引入 std::setprecision
#include <cmath>    // 引入 M_PI 或自定义计算函数

int main() {
    double price = 12345.6789;
    std::cout << std::fixed << std::setprecision(2)
    << price << std::endl;
    // 输出:12345.68


}

推荐文档