与数字真的奇怪的互动

时间:2016-09-22 08:01:23

标签: pascal

今天我正在进行大学编程课程练习,并想出了这个奇怪的事情。我想知道是否有人可以向我解释这里发生了什么。

这是我编码的内容:

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。怎么可能呢?

1 个答案:

答案 0 :(得分:0)

在处理以二进制表示的小数时,您会看到舍入错误。其他评论者暗示,但只是没有具体说明。

为了解决这个问题,将平等判断为范围而不是平等是很重要的。例如,为了确定实数x是否等于0.2,不要将其测试为x = 0.2,而是测量| x-0.2 | <。 epsilon,其中epsilon是你想要的容忍度。也许abs(x-0.2)<0.000001就足够了。