c - 有没有办法为 CS50 Cash 问题集 1 运行以下代码
问题描述
我对 CS 和编程非常陌生,正在尝试为 cs cash 问题集 1 编写代码。我认为这不是预期的解决方案,我知道这不是一个干净简洁的代码,但是在这个点我只是想让它运行。我想知道我写的代码是否完全是乱码,或者它是否真的可以工作,因为它在理论上对我来说真的很有意义。
#include<stdio.h>
#include<cs50.h>
#include<math.h>
int main(void)
{
float change;
do
{
change= get_float("Enter change here\n");
}
while(change<0);
int quarter=floor(change/0.25);
int dime=floor((change-(quarter*0.25))/0.10);
int nickel=floor((change-(quarter*0.25)-(dime*0.10))/0.05);
int penny=round((change-(quarter*0.25)-(dime*0.10)-(nickel*0.05))/0.01);
int sum =quarter+nickel+dime+penny;
printf("%i",sum);
}
解决方案
这是许多初学者都在努力解决的一个常见问题,即浮点数的不精确性。使用浮点数和双精度数进行运算时,结果值可能会偏离小数点。您可以在此 SO 帖子中了解更多信息:为什么浮点数不准确?.
无论如何,您的程序涉及浮点除法和整数截断,它们通常不能很好地协同工作。在 $4.20 作为输入的示例中,在 Quarters 设置为 16 之后,在计算一角钱时,(4.2 - 0.25 x 16) / 0.10 实际上保存为 1.999998,而不是 2。然后将其截断(因为一角钱是一个整数)并保存为 1,这解释了您的程序给您的输出不准确。一个解决方案是将所有内容乘以 100,使用整数除法来避免不精确。所以上面的例子会变成 (420 - 25 x 16) / 10,它会在你的一角整数中正确地保存为 2。
推荐阅读
- c++ - In gtkmm, How to imply function which can create a new window when detach a notebook tab?
- .net-core - One to many with optional parent
- dbt - yml 文件的 DBT 问题:profiles.yml 中的配置文件 my-bigquery-db 为空
- python - Synchronising writes into AmazonDB using Python
- java - 加入 JPA 查询——spring boot
- rust - 指定 Rust 闭包的生命周期
- node.js - 为什么 Node.js 不能导入模块?错误 [ERR_MODULE_NOT_FOUND]
- java - 有没有任何方法可以使用 selenium 处理身份验证警报,而无需任何操作系统工具,如 autoIT 和机器人
- html - 将 .HTML Jupyter Markdown 上传到 Git 页面
- woocommerce - 以编程方式将订单注释和项目元注释添加到现有的 woocommerce 订单