PHP / MYSQL的异常值浮动

Unusual values with PHP/MYSQL floats

本问题已经有最佳答案,请猛点这里访问。

我刚碰到一个奇怪的问题。我在MySQL中有以下表格:

1
2
3
4
5
6
7
8
9
table:deposits
user_id    amount
1          0.50

table:withdrawls
user_id    amount
1          0.01
1          0.01
1          0.01

为了获得平衡,我运行这个:

1
SELECT (IFNULL((SELECT sum(amount) FROM deposits WHERE user_id = 1),0) - IFNULL((SELECT sum(amount) FROM withdrawls WHERE user_id = 1),0) ) as balance

然后我把它作为

1
return (float) $row['balance']

出于某种奇怪的原因,结果是浮动(0.47000000067055)。有人知道为什么会有奇怪的圆角吗?


浮点运算并不能精确地表示所有实数。0.01转换为可表示值,本质上是一个有效位数目有限的二进制数字。由于1/100不能用有限位数的二进制数字精确表示(同样,1/3的十进制数字需要无限位数:.3333…),因此转换为浮点对值进行舍入。

也就是说,我不知道到底是如何生产47000000067055。将0.01转换为ieee-754 64位二进制浮点,并将其正确舍入到最近,生成0.01000000000000000020816681711721685132943093776702880859375。从0.5中减去3次,每次舍入产生0.469999999973354647409962430298328399658203125。从.5中减去三倍的值,得到相同的值。

我怀疑您的PHP实现以一种不太理想的方式将0.01转换为浮点。