C++不同命名空间下同名类double成员cout输出未保留小数位问题
问题解答
根本原因
该问题和命名空间、类的封装逻辑完全无关,是std::cout的默认浮点数输出规则导致的:
默认情况下,std::cout会自动截断浮点数末尾无意义的0,当小数部分全部为0时,会直接以整数形式输出,不会改变变量本身的double类型。
你可以通过给data1赋值5.123验证这一点,此时程序会正常输出5.123而非整数。也可以通过typeid验证变量类型:
cout << typeid(a.data1).name();
输出结果会对应double类型的标识,证明成员变量类型没有异常。
修复方案
如果需要固定输出3位小数,需要使用C++标准库的格式控制工具:
- 在main.cpp头部引入格式控制头文件
<iomanip> - 输出前通过
std::fixed和std::setprecision指定输出规则
修改后的完整main函数代码如下:
#include<bits/stdc++.h> #include <iomanip> #include "next.h" using namespace std; using namespace custom; using namespace custom2; int main() { custom2::aries a; a.data1=5.000; // fixed指定固定小数位输出,setprecision(3)指定保留3位小数 cout << fixed << setprecision(3) << a.data1; return 0; }
运行后会输出你预期的5.000。
格式参数说明
std::fixed:指定浮点数以固定小数位格式输出,不会自动省略小数部分,也不会切换为科学计数法std::setprecision(n):和std::fixed搭配使用时,代表浮点数保留n位小数,不足的位数会自动补0
内容的提问来源于stack exchange,提问作者John Mellow
相关产品推荐
相关产品推荐

