我不确定为什么我的代码产生这个算术错误?
发布时间:2020-12-16 07:15:53 所属栏目:百科 来源:网络整理
导读:嘿,我正在研究c中的一个程序,告诉你任何给定金额所需的硬币数量最少.我有一个程序编写,适用于我测试的每个金额,除了4.20美元. 这是我的代码: #include cs50.h#include stdio.h#include math.hint main(void){ float f; int n,x,y,z,q,s,d,t; do { printf("H
嘿,我正在研究c中的一个程序,告诉你任何给定金额所需的硬币数量最少.我有一个程序编写,适用于我测试的每个金额,除了4.20美元.
这是我的代码: #include <cs50.h> #include <stdio.h> #include <math.h> int main(void) { float f; int n,x,y,z,q,s,d,t; do { printf("How much change do you need?n"); f = GetFloat(); } while(f <= 0); { n = (f * 100); } q = (n / 25); x = (n % 25); y = (x / 10); z = (x % 10); s = (z / 5); d = (z % 5); t = (q + y + s + d); { printf("%dn",t); } } 奇怪的是当我输入4.20输出是22而不是18(16宿舍和2角钱).我做了一些调查,发现问题出在我的变量x上.当我输入4.2时,x给我19而不是20.我尝试了其他我认为应该产生相同问题的案例,如5.2和1.2,但它在这些情况下正常工作.这可能是一个舍入问题,但我认为同样的错误也会发生在那些相似的值上. 有没有人知道为什么会这样? PS我对编码很新,我还没有得到很多正式的指导,所以如果你看到任何明显的东西,我也欢迎有关更好的缩进和格式化的提示. 解决方法
IEEE 754 floating point通常略微不精确,而且铸造会截断,而不是圆形.可能发生的是4.20 * 100评估为419.999999999999994(确切数字是无关紧要的,点是,它不是420),转换为int会丢弃小数部分,产生419.
简单的方法就是: n = f * 100 + 0.5; 或者您可以使用适当的功能: n = round(f * 100); 如果数字“几乎”精确,任何一个都没问题,只有当有人通过非整数美分(“4.195”之类)时才会出现差异,如果你使用浮动货币价值,你就是’我们已经接受了边际的精确度问题;如果您需要精确数字,则可以使用具有固定精度的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |