默认cout浮点输出为6位有效数字;需std::fixed与std::setprecision(n)配合才能固定小数点后n位,二者均需#include ,且格式状态持久,须显式重置。

用 std::setprecision 和 std::fixed 控制小数位数
默认情况下,cout 对浮点数使用“有效数字”计数(6 位总精度),不是小数点后几位。要固定小数位数,必须组合使用 std::setprecision 和 std::fixed:
-
std::fixed切换到定点表示法(否则setprecision(2)输出1.2e+03这类科学计数) -
std::setprecision(n)在fixed模式下才表示“小数点后 n 位” - 这两个都是流操纵器(manipulator),需
#include <iomanip></iomanip>
示例:
#include <iostream>
#include <iomanip>
int main() {
double x = 3.1415926;
std::cout
<h3>用 <code>std::setw</code> 和 <code>std::left</code>/<code>std::right</code> 控制对齐与宽度</h3>
<p><code>std::setw(n)</code> 只对**下一个输出项**生效,且仅在输出内容长度不足 n 时补空格(左/右对齐取决于当前对齐标志):</p>
<ul>
<li>默认右对齐;用 <code>std::left</code> 改为左对齐,<code>std::right</code> 显式恢复右对齐</li>
<li>
<code>std::setw</code> 不影响数字本身精度,只控制字段宽度</li>
<li>它不自动截断超长内容,也不填充小数位——那是 <code>setprecision</code> + <code>fixed</code> 的事</li>
</ul>
<p>示例:</p>
<pre class="brush:php;toolbar:false;">std::cout
<p>注意:多次输出需重复写 <code>setw</code>,它不会持续生效。</p>
<h3>为什么 <code>cout 有时输出 3.1?</code>
</h3>
<p>这是最常见的误解来源:没加 <code>std::fixed</code>。此时 <code>setprecision(2)</code> 表示“总共保留 2 位有效数字”,所以 <code>3.1415</code> → <code>3.1</code>,而 <code>0.001234</code> → <code>0.0012</code>(仍是 2 位有效数字)。只有加上 <code>std::fixed</code> 才锁定小数点后位数。</p>
- 想统一按小数点后位数控制?务必配对使用:
std::fixed - 临时切回科学计数?用
std::scientific替代fixed -
std::defaultfloat可恢复默认行为(但不常用)
格式状态是流的属性,容易被意外覆盖
cout 的格式标志(如 fixed、left、精度值)是持久的,直到你显式改写。这意味着:
- 在一个函数里设了
fixed,后续所有cout都会受影响,除非重置 - 第三方库或日志代码可能悄悄修改了
cout状态,导致你的输出异常 - 没有“作用域自动恢复”机制,不能像 RAII 那样安全封装
稳妥做法是:每次关键输出前显式设置所需格式,或用 std::ios_base::fmtflags 保存/恢复状态(但开销略大)。简单场景下,宁可多写几遍 fixed ,也别依赖隐式状态。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











