C++中setprecision控制小数位数失效,计算单词平均长度遇异常
问题:C++中
setprecision(1)未按预期保留一位小数 我正在学习子程序(英文称subroutines/subprograms),当前作业需计算两个单词的平均长度,编写了如下C++代码:
void Length(string const text_1, string const text_2, int & total_length, double & mean_length) { total_length = text_1.length() + text_2.length(); mean_length = static_cast<double>(total_length) / 2; } void Length_Program(int val) { string text_1; string text_2; int total_length{}; double mean_length{}; cout << "Mata in två ord: "; cin >> text_1 >> text_2; cout << "Totallängd: "; Length(text_1, text_2, total_length, mean_length); cout << total_length << endl; cout << "Medellängd: " << fixed << setprecision(1) << mean_length; }
我设置setprecision(1)期望仅保留一位小数,但实际却输出两位小数。例如输入abcd和E时,期望平均长度为2.5,却得到2.51,请求帮忙分析问题所在。
问题原因及解决方案
核心问题:缺失
<iomanip>头文件
代码中使用了setprecision和fixed这两个格式控制符,但没有包含对应的<iomanip>头文件。这会触发编译器的未定义行为——部分编译器可能会意外识别这些符号,但更大概率出现格式控制失效、输出异常的情况。必须在代码开头添加:#include <iomanip>同时别忘了补充
iostream和string的头文件,否则连cout、string都无法正常编译。计算逻辑无错误
输入abcd(长度4)和E(长度1)时,总长度为5,平均长度是5/2=2.5,你的计算逻辑完全正确。出现2.51这类错误输出,本质是格式控制符未被正确识别导致的流状态异常。额外注意:流状态的一致性
如果程序其他部分(比如Length_Program被调用前)修改过输出流的格式状态,可能会干扰当前的精度设置。可以在设置格式前显式重置流状态,比如:cout << resetiosflags(ios::floatfield); // 重置浮点格式 cout << "Medellängd: " << fixed << setprecision(1) << mean_length;
修复头文件缺失问题后,代码会正确输出2.5,符合一位小数的预期格式。
内容的提问来源于stack exchange,提问作者Zeptuz
相关产品推荐
相关产品推荐

