未使用std::fixed时std::setprecision对极小值的输出格式疑问
关于std::setprecision非fixed模式下的输出规则解析
测试代码
#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; }
编译输出(VS2022)
d1=0.0006 d2=6e-05 d3=1.0006 d4=1.00006
问题解析
通用格式的核心规则
当不指定std::fixed或std::scientific时,C++标准库的流输出默认采用通用格式,它会自动在定点格式和科学计数法之间切换,关键规则有两条:
std::setprecision(n)在这里指定的是有效数字的总位数,不是小数点后的位数;- 切换阈值:当数值的绝对值小于
1e-4(即0.0001)或者大于等于1e16时,自动切换为科学计数法输出;其余情况用定点格式。
针对示例的具体说明
- d1=0.0006:数值绝对值0.0006大于
1e-4,用定点格式输出。它的有效数字只有1位(末尾的6),setprecision(9)允许最多9位有效数字,所以直接输出0.0006; - d2=0.00006:数值绝对值6e-5小于
1e-4,触发通用格式的科学计数法规则,因此输出6e-05,这里有效数字1位,完全符合setprecision(9)的要求; - d3=1.0006和d4=1.00006:数值绝对值都在
1e-4到1e16的范围内,用定点格式输出,它们的有效数字分别是5位和6位,都没超过setprecision(9)的限制,所以直接以定点格式显示完整的有效数字。
内容的提问来源于stack exchange,提问作者LarsA
相关产品推荐
相关产品推荐

