PHP / MYSQL的异常值浮动

时间:2013-09-28 00:26:58

标签: php mysql floating-point

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

table:deposits
user_id    amount
1          0.50

table:withdrawls
user_id    amount
1          0.01
1          0.01
1          0.01

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

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

然后我将其作为

返回
return (float) $row['balance']

由于一些奇怪的原因,结果是浮动(0.47000000067055)。有谁知道为什么有奇怪的四舍五入?

1 个答案:

答案 0 :(得分:0)

浮点运算并不完全代表所有实数。 0.01被转换为可表示的值,实质上是具有有限数量的有效位的二进制数字。由于1/100不能用二进制精确表示有限位数(十进制中的1/3同样需要无穷多位数:.3333 ......),因此转换为浮点数会使该值四舍五入。

那就是说,我没看到0.47000000067055究竟是如何产生的。将0.01转换为IEEE-754 64位二进制浮点,并将正确的舍入值转换为最接近的值,产生0.01000000000000000020816681711721685132943093776702880859375。从.5中减去三次,每次舍入,产生0.4699999999999999733546474089962430298328399658203125。从.5中减去三倍的值会产生相同的值。

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