Pascal 与数字的互动真的很奇怪

Pascal 与数字的互动真的很奇怪,pascal,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,第二个为0。这怎么可能呢?在处理以二进制表示的小数时,

今天我在做大学编程课的练习,突然想到了一件奇怪的事情。我想知道是否有人能向我解释这里发生了什么

这是我编写的代码来显示它:

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

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


为了解决这个问题,重要的是将平等作为一个范围而不是一个平等来判断。例如,要确定实数x是否等于0.2,请不要将其作为x=0.2进行测试,而是针对| x-0.2 |<ε进行测试,其中ε是所需的公差。也许abs(x-0.2)可能是注意到的重复,它不是-1.3。。。但是-1.3…E-020,也就是-0.000…13(带20个零)。在PHP和我的Fedora桌面计算器上,它的计算结果是-5.55111512313e-17。因此,这是计算机数学的一个广泛症状,而不仅仅是帕斯卡请参阅此以了解确切的问题:0.2-0.1.28或类似。29_不_等于_到_0.3FI在我的电脑上没有Pascal,但如果将0.2替换为0.125,将0.8替换为0.875(以便除以2的幂),会发生什么情况?因为计算机是基于base-2的,所以这个问题不应该发生。@Dominique:不,那么就不会发生了。但我猜用户3494378希望看到所有类型的数字都是
0
,例如
1-0.3-0.7
,换句话说,他希望得到准确的结果。然后,这是一个重复。