我有一个程序
e=0.01;
test3=Ask(1,2)-Bid(1,2);
(Bid
和Ask
都是for循环生成的矩阵。
我知道有时test3可能等于e,但是matlab给了我这个:
>>test3
e
test3==e
test3>e
test3 =
0.0100
e =
0.0100
ans =
0
ans =
1
它出了什么问题?谢谢!
编辑:我尝试了format long
,然后我得到了
Ask(1,2) =
8.620000000000001
Bid(1,2) =
8.609999999999999
test3 =
0.010000000000002
难怪我弄错了。但实际上我已经使用price=roundn(r*v,-2)
,而Ask(1,2)
和Bid(1,2)
都等于某些price
,所以它们只应该有两个小数位。如果我想将它们四舍五入到小数点后两位,我现在该怎么办?再次感谢!
答案 0 :(得分:2)
通常,舍入误差使得难以比较浮点数。
0.1是一个很好的十进制数1/10,但是以二进制形式存储在计算机上它是一个重复的部分,并没有完全存储。
仅举例如:
x = 0.2;
y = 0.1 + 0.1;
x == y
不会是真的。
[不幸的是,正如rwong在下面指出的那样,这实际上并非如此。我应该试试吧!在这个时刻,Octave对我来说太聪明了。不过,总的来说,还会有结果!]
有时错误将足以看到第16位,这就是为什么你得到评论尝试格式很长。但有时它可能不可见。底线是:
绝对不使用==两位小数。它几乎总是错误的,而且通常没有意义。
你想要的是测试两个数字是否彼此非常接近,即:
abs(x-y)< 0.00001
有一些小限制。
答案 1 :(得分:0)
如果test3 = 0.01000000000000001
或某些此类e = 0.01
那么您可能会得到这种结果,当您打印test3-e
时会发生什么情况会给您提供线索 - 这就是安全性的原因关键字段浮动==浮动总是会引起审计员的警钟。