简单算术中的奇怪行为

ily*_* iz 1 php math floating-point

可能重复:
在PHP中奇怪添加数字字符串

$r = 1.0 - 0.8 - 0.2;
var_dump($r);
Run Code Online (Sandbox Code Playgroud)

我得漂浮-5.5511151231258E-17.我在C++和C#中得到的结果相同.

MySQL我通过查询获得结果0.0:

SELECT 1.0 - 0.8 - 0.2
Run Code Online (Sandbox Code Playgroud)

Ben*_*oit 8

让它清楚:0.8十进制中的有限表示因为它有价值8/10¹.

但在基数2,它有价值:1/2 + 1/4 + 0/8 + 0/16 + 1/32 + 1/64 + 0/128 + ......它没有结束,就像三分之一有十进制表示(0.333…)中没有结尾但是0.1在基数3中.

0.8 = 0.110011001100110011001100... in binary
0.2 = 0.001100110011001100110011... in binary
Run Code Online (Sandbox Code Playgroud)

您的计算机以二进制表示形式存储浮点值.因此,当您添加,减去,乘以等数字时,精度会下降.

C++,C和C#是编译语言,浮点数通常存储在4或8个字节中.你不能在浮动中存储0.8.

MySQL可能会告诉你0,因为它会截断计算结果.

如果您想要一个在任何基础上执行计算而不会丢失精度的库,请查找GMPlib.