C++中std::cout默认不显示浮点数小数部分的原因及相关输出问题咨询
C++中std::cout默认不显示浮点数小数部分的原因及相关输出问题咨询
嘿,我最近在折腾C++里的浮点数输出,碰到个有点懵的问题,想跟大伙请教下。
我写了个简单的计算:1359270除以4,用计算器算明明是339817.5,但用std::cout直接输出的时候,结果却是339818。我最开始的代码是这样的:
#include <iostream> using namespace std; int main() { int var1 = 1359270; int var2 = 4; cout << static_cast<double>(var1) / var2; }
我还试着把变量类型改成double,结果还是一样。
不过当我加上std::setprecision和std::fixed之后,输出就正常了,代码是这样的:
#include <iostream> #include <iomanip> using namespace std; int main() { int var1 = 1359270; int var2 = 4; cout << fixed << setprecision(1) << static_cast<double>(var1) / var2; }
这次就输出了我想要的339817.5。
所以我就有点搞不懂了,这到底是浮点数精度的问题,还是std::cout本身的格式化规则导致的?
对了,我用的是Windows系统下的Code::Blocks IDE,编译器是MinGW-64 GCC,C标准是C20。
问题解答
这完全是std::cout的默认格式化规则导致的,跟浮点数精度没啥关系哦!
咱们来掰扯清楚:
std::cout默认情况下,会自动省略浮点数末尾的小数部分,而且当浮点数的整数部分可以准确表示时,它甚至会直接输出成整数形式。另外,默认的输出精度(用std::setprecision不带fixed的情况)是6个有效数字,当你的结果339817.5用6个有效数字表示的话,就是339818(四舍五入后),这就是你最开始看到的结果。- 当你加上
fixed修饰符后,std::setprecision(n)就变成了指定小数点后的位数,而不是有效数字。你设置成1位小数,它就会老老实实地显示到小数点后1位,自然就输出了339817.5。
再补充一点:你用double类型来存储这个计算结果是完全没问题的,1359270和4都是整数,转换后的double值339817.5是可以被二进制浮点数精确表示的,所以根本不存在精度丢失的情况,纯粹是输出格式化的锅。
内容来源于stack exchange
相关产品推荐
相关产品推荐

