为何setprecision(2)格式化后,if条件判断仍不生效?
问题分析与解决
你的问题和setprecision(2)无关——这个函数只是控制输出时的显示格式,不会改变quotient变量实际存储的数值。
核心原因:浮点数的精度特性
2除以3的结果是无限循环小数0.666666...,而float类型只能存储这个数的近似值(实际约为0.6666666865348816)。当你输入0.67时,程序存储的answer是另一个近似值(约为0.6699999570846558)。这两个近似值并不相等,所以quotient == answer的判断永远为假,自然走else分支。
正确的解决方法
不要直接用==比较浮点数,而是判断两个数的绝对差值是否小于一个极小的阈值(比如1e-6,即0.000001),只要差值在这个范围内,就认为两者相等。
修改后的代码如下:
#include <iostream> #include <iomanip> #include <cmath> // 用于fabs函数 using namespace std; int main() { float x = 2; float y = 3; float quotient, answer; quotient = x / y; cout << fixed << setprecision(2); cout << quotient << " (is the answer)\n"; cout << " What is " << x << " divided by " << y << " ? "; cin >> answer; // 预期输入为0.67 // 用差值判断,而非直接相等 if (fabs(quotient - answer) < 1e-6) cout << " You got the right answer! "; else cout << " Nice Try :( "; return 0; }
额外说明
fabs()函数用于计算浮点数的绝对值,需要包含<cmath>头文件。- 阈值大小可按需调整:如果只要求两位小数精度,用
1e-2(0.01)也足够。
内容的提问来源于stack exchange,提问作者Ervin Pejo
相关产品推荐
相关产品推荐

