引入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
相关产品推荐
相关产品推荐

