【问题标题】:Unusual values with PHP/MYSQL floats [duplicate]PHP / MYSQL浮动的异常值[重复]
【发布时间】:2013-10-04 09:53:19
【问题描述】:

我遇到了一个奇怪的问题。我在 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)。有谁知道为什么会有奇怪的四舍五入?

【问题讨论】:

    标签: php mysql floating-point


    【解决方案1】:

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

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

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

    【讨论】:

    • 你说得对,它是重复的。谢谢指点!
    猜你喜欢
    • 1970-01-01
    • 2015-07-28
    • 2018-12-07
    • 2014-09-18
    • 2013-04-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多