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

引入math.h后CS50第一周便士问题仍无法正确四舍五入

问题核心原因

你有两个关键实现遗漏,和是否引入math.h没有直接关系:

  • 引入math.h只是让编译器能识别数学库的函数声明,不会自动给你的代码追加四舍五入逻辑,你全程没有调用四舍五入对应的round()函数。
  • float是二进制浮点类型,绝大多数十进制小数(比如4.2)无法被精确存储,实际存入变量的是略小于真实值的近似值:4.2实际存储值约为4.1999998,乘以100之后得到419.99998,直接赋值给int类型变量时,C语言会直接截断舍弃所有小数部分,最终得到419,也就是对应4.19美元的错误结果。
修正方法

在美分换算的步骤调用round()函数对乘100后的结果做四舍五入,再转成整数即可,修正后的完整代码如下:

#include <cs50.h>
#include <math.h>
#include <stdio.h>

int main(void)
{
    float amount = get_float("Dollar Amount: ");
    int pennies = round(amount * 100);
    printf("Pennies: %i\n", pennies);
}

额外提示:这类货币换算场景本身不推荐用浮点数处理,更稳妥的工业级实现是从输入阶段就按最小货币单位(美分)做整数运算,从根源上规避浮点精度误差。但CS50第一周的该习题考察点就是round()函数的使用,上面的改法可以完全通过包括4.20在内的所有测试用例。

内容的提问来源于stack exchange,提问作者Kapza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:45:38