CS50 Pset1/Cash问题:while循环无法识别浮点数相等判断条件
问题根因:浮点数精度误差
0.1、0.05这类十进制小数无法被二进制浮点数精确存储,实际会保存为一个非常接近原值、但存在正负微小偏差的数值。你通过printf看到的0.100000只是默认保留6位小数四舍五入后的展示值,实际内存中扣除0.1后的剩余找零实际值略小于0.1,因此>=0.1的判断条件不成立。
调整常量后0的数量没有作用,因为这些常量本身就无法被精确表示为二进制浮点数。
标准解决方案
CS50的Cash作业官方推荐的做法是完全规避浮点数运算,将金额统一转换为整数美分计算:
- 第一步将用户输入的美元浮点数金额转换为整型美分:
// 需要引入<math.h>头文件,编译时需链接数学库 int cents = round(change * 100); - 后续所有硬币统计逻辑都改用整数运算:
while (cents >= 10) { cents -= 10; coins++; } while (cents >=5) { cents -=5; coins++; } // 剩余1美分、25美分处理逻辑同理
整数运算不存在精度误差,可以完全避免你遇到的判断失效问题。
内容的提问来源于stack exchange,提问作者qhuboo
相关产品推荐
相关产品推荐

