【发布时间】:2015-11-17 21:00:01
【问题描述】:
考虑以下简单的划分:
A=8.868;
A/0.1
ans =
88.679999999999993
由于浮点精度,这会导致一个小错误。有什么办法可以防止这种情况发生吗?基本上我所做的只是将逗号移动一个位置,而不是接近 MATLAB 中允许的最大位数。
我想得到如下结果:
A/0.1
ans =
88.68
其中的尾随零无关紧要,只要它们只是零,并且在第 14 位左右不包含某个数字。
有趣的是,当四舍五入到 N 数字时也会弹出这个问题:
R = (randi([8659 49847],[1e3 1]))/1e3;
xmin = min(R);
el = 0.1;
step = 1/el;
tmp1=xmin/el;
tmp2=round(tmp1);
tmp3=round(tmp2*el,3);
tmp3 =
8.699999999999999
【问题讨论】:
-
只是出于好奇:为什么会这样?为什么不乘以 10?
-
@AnderBiguri 因为在我的情况下,我的网格大小以厘米为单位,这意味着它也可以是例如0.25、0.12 或客户想要的任何值。
-
@AnderBiguri
A*10在这种情况下也不精确...... -
但问题永远存在。这不是因为您在进行浮点运算时失去了精度,而是因为您无法将所需的数字存储在浮点数中。您始终可以将其存储为带有小数位数信息的 int 或 char,但是一旦转换为浮点数,您将失去该准确性。问题是不可能将
88.68作为浮点数存储在内存中。