我刚刚遇到一个奇怪的问题。我在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)。有谁知道为什么有奇怪的四舍五入?
答案 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
转换为浮点数。