某同学执行 C++ 代码 cout << ((0.1 + 0.2) == 0.3) 时输出 0,下面最可能的原因是( )。
答案B。考点: 阅读/完善程序——逐行模拟执行
【考点】浮点数存储|二进制表示|精度误差
本题对应 GESP 202603 C++ 二级第三章“数据类型与运算符”,命题人专门卡住“浮点比较”这一高频易错点。绝大多数考生会机械套用数学直觉,却忽略了计算机底层二进制存储的精度限制。
看到浮点字面量参与运算,立刻反应“二进制无法精确表示”。0.1 和 0.2 在 IEEE 754 标准下均为近似值,相加结果存在微小舍入误差。通法:凡涉及浮点等式判断,一律用带容差的比较(如 fabs(a-b)<1e-9)而非直接 ==,这是 GESP 二级浮点专题的必考套路。
选项 A 是典型“语言缺陷论”,命题人利用考生对底层机制的无知,把浮点误差包装成 C++ 的 bug,诱导选择。选项 C 偷换“运算符可用性”与“比较可靠性”的概念,== 本身可比较浮点,只是结果不可靠。选项 D 则违背数学常识,计算机只是无法精确表示。最阴险的细节在于:题目不要求你计算误差,只问“最可能的原因”,考生若只背“浮点比较要用容差”,就会忽略“误差来源”这一关键。
命题人若把等号换成减法,答案会从 0 变为一个极小的非零浮点数。刷到此类题,先问自己:这是考浮点精度,还是考运算符优先级?本题核心就是“浮点精度”,而非"C++ 加法 bug"。