考虑以下简单划分:
A/0.1
ans =
88.68
由于浮点精度,这会导致一个小错误。有没有办法防止这种情况发生?基本上我所做的就是将逗号移到一个位置,同时不接近MATLAB中允许的最大位数。
我想获得一个结果:
N
其中尾随零无关紧要,只要它们只为零,并且不包含第14位左右的某个数字。
有趣的是,当四舍五入到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
数字时,这个问题也会出现:
$(function() {
$('#selectAll').click(function() {
if ($(this).prop('checked')) {
$('.your_checkbox_class').prop('checked', true);
} else {
$('.your_checkbox_class').prop('checked', false);
}
});
});
答案 0 :(得分:6)
使用符号数学,您可以获得精确的结果:
x=sym('8.868')/sym('.1')
答案 1 :(得分:5)
你可以随时使用fixed point算术,其中斜率是10的倍数。当你乘以/除以10时,你不会有任何不准确之处。在Matlab中,您可以使用Fixed Point Toolbox
编辑:根据您的评论 - 看起来您可以将斜率设置为0.05。
答案 2 :(得分:4)
这个答案仅在我的情况下发布完整性。
我使用unique
的第三个输出
el = 0.25;
A = (randi([7364 84635],[1e4 1]))/1e3;
B = A/el;
C = round(B);
D = C*el;
[tmp1,tmp2,tmp3] = unique(D);
E = tmp1(tmp3,:);
all(E==D)
ans =
1
正确进行分箱。因此,即使中心点可能不精确且具有无限精度,它们也至少在10位左右,这超过了我原始数据的3位精度。
答案 3 :(得分:3)
您可以将数字表示为整数的分数。只要你不转换为float,就不会失去精度:
A = 8.868;
div = 0.1;
[N1,D1] = rat(A);
[N2,D2] = rat(div);
% divide A by div:
N = N1 * D2;
D = N2 * D1;
当然,您的数字可能不准确,如其他答案/评论中所述。转换为分数也可以引入近似值,但这取决于您处理的数字以及tol
的{{1}}参数。