if语句无法正确判断浮点数近似相等问题求助
C++习题调试:浮点数差值判断问题
问题根源
你的代码存在两个核心问题:
- 判断逻辑完全不符合要求:习题要求当两数差值小于
1.0/100(即0.01)时输出提示,但你写的是i - j == 0.01——这只会在两数刚好相差0.01时触发,而且浮点数的精度特性会导致这个条件几乎不会命中(比如实际计算出的差值可能是0.0099999999999998)。 - 分支顺序与逻辑错误:原代码把"几乎相等"的判断放在最前面,会覆盖后续的大小关系判断,而且没有考虑差值为负数的情况(比如i比j小0.005时,
i-j是-0.005,不等于0.01,就不会触发提示)。
修正后的代码
#include <iostream> #include <cmath> // 用于浮点数绝对值计算 int main() { double i = 0; double j = 0; while (std::cin >> i >> j) { std::cout << "\n"; std::cout << i << "\t" << j << "\n\n"; // 先输出大小关系或相等结果 if (i == j) { std::cout << "The Numbers Are Equal\n"; } else if (i > j) { std::cout << "The Larger Value Is " << i << "\n"; } else { std::cout << "The Larger Value Is " << j << "\n"; } // 判断是否几乎相等并输出提示 const double threshold = 1.0 / 100; if (std::abs(i - j) < threshold) { std::cout << "THE NUMBERS ARE ALMOST EQUAL\n"; } } return 0; }
关键修改说明
- 使用绝对值判断差值:
std::abs(i - j)确保无论i和j谁大谁小,都能正确计算差值的绝对值,避免负数差值导致的判断失误。 - 替换为范围判断:用
< threshold代替== 0.01,符合习题"差值小于0.01"的要求,同时避开浮点数直接相等比较的精度陷阱。 - 调整逻辑顺序:先输出大小关系或相等结果,再判断并输出"几乎相等"的提示,完全匹配习题的输出要求。
- 定义阈值常量:用
const double threshold = 1.0 / 100代替硬编码的0.01,让代码更易读且符合习题描述。
内容的提问来源于stack exchange,提问作者Jconnors266
相关产品推荐
相关产品推荐

