哇. .舍入误差
同样,“round(X,N)”也会出错——就像它不能有第二个参数一样
很好的问题,不是太难,但需要一点思考
我花了很长时间(在阅读评论之前!!)才发现,例如rem(135.01100)的结果不是35.01,而是35.009999999999991。
有谁能告诉我为什么会有这个问题,以及如何解决它(不是通过添加1e-3)!
好工作!我喜欢解决这个代码
我无法理解这个问题。意味着什么?
为什么函数roundn是未定义的?
函数b = makingChange(a)
铜=[10000、5000、2000、1000、500200100、50岁,25日,10日,5日,1];
b = [];
m = * 100;
因为我= 1:11
b (i) =地板(m /铜(i));
m =桶(i) *铜(i);
结束
b (12) = m;
结束
嗯,要解决这个问题,你需要AD 0.001到a
由于浮点运算,向量b的最后一个元素可能与正确答案不同(通常比它小1)。所以我最后加了1e-4来修补它。
我用代码....得到了正确的答案
---
函数b = makingChange(a)
变化= [100 50 20 10 5 2 1 0.5 0.25 0.1 0.05 0.01];
For I = 1:(length(change)-1)
b (i) =地板(/变化(i));
A = A - b(i)*change(i);
结束
b (12) = a /改变(12);
结束
---
但它告诉我,我都搞错了。不知道为什么。
乔,我想你有一个浮点舍入错误。我也有同样的问题,这让我很沮丧。如果你看一下b(12)的值和它输出的值,它输出0.99999。虽然我们知道这是正确的,但计算机不。如果你只是在循环的最后或在b(12)=round(a/change(12), 2)这一行加上一些东西,这将使它四舍五入到最接近的整数,应该会得到你想要的答案。
这里的真正挑战是当使用圆形或地板时,数值进动的问题。我不认为这是故意的。这里的“修复”来自于对这个解决方案的其他评论(即在输入a中添加1e-6)
我必须加入'round'函数因为出于某种原因,我的Matlab和这个都得到了135.01-100=35.0099999999。不知道为什么。
1e-3是必需的,因为有一个MATLAB bug使最后一个“a”略小于0.01 (1e-15)
这不是MATLAB的错误,而是二进制系统中小数表示的固有问题。
我与浮点数问题作斗争,所以这是我能想到的最好的解决方案。
有数值精度问题…因此,sqrt (eps)。
对我来说,在结尾出现四舍五入错误的情况下,很难写出好的代码。
好问题。