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 等) | 科学计算/数学建模中需要精确显示常数值 |
|
比较浮点值前的调试输出 | 打印所有小数位,避免因精度丢失导致误差 |
(不加 |
导出数值到 CSV/日志 | 导出用于进一步分析的精度数据 |
|
金融、货币计算 | 显示保留 2~4 位小数的金额值 |
|
科学计数法格式输出 | 输出极大或极小的数值(如概率) |
|
序列化为字符串保存浮点精度 | 保证精度还原如二进制数据时的精确性 |
|
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 }