通常,浮点错误是指无法以 IEEE 浮点表示形式存储的数字。
整数存储时最右边的位为 1,左边的每一位都是 (2,4,8,...) 的两倍。很容易看出,它可以存储最多 2^n 的任何整数,其中 n 是位数。
浮点数的尾数(小数部分)以类似的方式存储,但从左到右移动,每个连续的位是前一个值的一半。(实际上比这要复杂一点,但现在可以了)。
因此,像 0.5 (1/2) 这样的数字很容易存储,但并非每个 <1 的数字都可以通过添加固定数量的 1/2、1/4、1/8、...
一个非常简单的例子是 0.1 或 1/10。这可以通过无限系列来完成(我真的不介意计算),但是每当计算机存储 0.1 时,存储的并不完全是这个数字。
如果您可以访问 Unix 机器,很容易看到这一点:
Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1
0.10000000000000001
>>>
无论您使用哪种语言,您都需要非常小心地使用浮点数和双精度数进行相等测试。
(对于您的示例,0.2 是另一个无法存储在 IEEE 二进制文件中的讨厌数字,但只要您正在测试不等式,而不是等式,例如 p <= 0.2,那么您就可以了。)