0

我刚刚遇到了一个奇怪的问题。我在 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']

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

4

1 回答 1

0

浮点算术不能准确地表示所有实数。0.01被转换为一个可表示的值,本质上是一个具有有限有效位的二进制数字。由于 1/100 不能用有限位数精确地表示为二进制(与十进制中的 1/3 需要无限位数相同的方式:.3333...),因此转换为浮点数会将值四舍五入。

也就是说,我不知道 0.47000000067055 是如何产生的。转换0.01为 IEEE-754 64 位二进制浮点并正确舍入到最接近会产生 0.01000000000000000020816681711721685132943093776702880859375。从 0.5 中减去 3 次,每次四舍五入,得到 0.4699999999999999733546474089962430298328399658203125。从 0.5 中减去该值的三倍会产生相同的值。

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

于 2013-09-28T00:54:19.330 回答