计算机处理绝对;它们不能在位级别明确表示分数。这是使用浮点表示来解决的,这是一种表示实数近似值的方法。
不幸的是,有些数字不可能 100% 准确地表示,这会导致在处理浮点运算时不精确。
有关确切原因的更多信息,请对浮点表示进行一些研究。但这是一门相当数学技术的学科。
编辑
让我澄清一下。我们都知道计算机处理二进制。它们读取、写入和处理 1 或 0 的位。
32 位处理器通常会将内存划分为 4 字节的块。所以整数和浮点数的默认大小是 4 字节,或 32 位。用二进制表示一个整数(一个 int)很容易。数字 8 是:00000000 00000000 00000000 00001000。但是计算机如何表示十进制数?请记住,它只能看到 1 和 0;它不能只放置一个“。” 在他们中间!
定点表示(例如,说前 16 位是整数值(. 之前的部分),后 16 位是小数值)显着限制了可以表示的数字范围,因为它减少了最大数字到 16 位 int 并可能浪费“。”之后的所有位。可能不需要。
因此计算机使用一种称为浮点表示的技术,其中数字使用编码指数进行缩放。所以数字的一部分是指数,一部分是分数。与定点表示法相比,这大大增加了可能数字的范围。但是有些数字无法完全精确地表示。
这就是为什么任何处理货币的计算机系统从不将值存储为浮点数(例如,1.10 英镑将始终存储为 110p)。任何需要精度的系统都应该执行与 int 一样多的算术运算,并在最后一步将任何除法转换为浮点数。
请注意,这不仅仅是一个 PHP 问题,它存在于所有语言中。例如,JavaScript:
alert((0.1+0.7)*10); // alerts 7.9999999999