今天我正在进行大学编程课程练习,并想出了这个奇怪的事情。我想知道是否有人可以向我解释这里发生了什么。
这是我编码的内容:
program problema;
var
a : real;
b : real;
begin
a := 1 - 0.8 - 0.2;
b := 1 - 0.2 - 0.8;
write(a);
writeln(b);
end.
虽然我希望它在两种情况下都返回0,但它实际上在第一个上返回-1.3 ...而在第二个上返回0。怎么可能呢?
答案 0 :(得分:0)
在处理以二进制表示的小数时,您会看到舍入错误。其他评论者暗示,但只是没有具体说明。
为了解决这个问题,将平等判断为范围而不是平等是很重要的。例如,为了确定实数x是否等于0.2,不要将其测试为x = 0.2,而是测量| x-0.2 | <。 epsilon,其中epsilon是你想要的容忍度。也许abs(x-0.2)<0.000001就足够了。