You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 10:57:00