【问题标题】:Falsely added precision with PDO, PHP & sybase使用 PDO、PHP 和 sybase 错误地增加了精度
【发布时间】:2023-03-07 18:12:01
【问题描述】:

我有一个类似于以下内容的查询。我从 PDO/PHP 得到的结果与在服务器上的交互式 SQL 提示符中得到的结果不同。通过交互式 SQL 运行此查询时,我可以正确看到交易金额(即 45.34)。

当我通过 PDO 提取结果时,我看到错误的结果加上错误的精度(即 45.3400000000001)。 PDO 中有没有可以设置为返回存储在数据库中的数据的东西?

Select tl.ID
       , tl.Transaction_Amount
from transactionLog tl

更新:查询返回的数据正在被格式化为 json。我已经验证了 pre-json 数据也包含错误数据。 antoox 的一个答案建议在查询中的 db 级别进行四舍五入。不幸的是,这无济于事,因为查询在 SQL 提示符下运行时会返回正确的数据,并且一旦通过 PDO 就会不正确地显示舍入与否。 antoox 也提到了 PHP 错误 #53632。不幸的是,这个错误不是我们环境中的一个因素,因为我们使用的是更新的版本。

更新: Sybase Central 报告的数据库字段为数字大小 10,小数位数为 2。

【问题讨论】:

  • 我添加了包含此信息的更新。数字大小为 10,比例为 2。谢谢。

标签: php pdo sybase


【解决方案1】:

几个版本的 PHP 都有一个floating point bug

您可以进行如下查询:

SELECT tl.ID, round(tl.Transaction_Amount, 2) FROM transactionLog tl

,或者更新你的php版本。

【讨论】:

  • 感谢 antoox 的建议。不幸的是,我们远远超出了此错误中列出的版本,并且该 url 中列出的测试脚本通过了。此外,由于数据似乎正确地来自 Sybase,因此在数据库级别进行四舍五入也无济于事,因为问题似乎发生在 PDO 级别。
  • 由于您的回答在技术上是解决其他人遇到此问题的可能解决方案,即使它在技术上不是解决我的具体问题的方法,我也会将其提供给您。谢谢 antoox。
【解决方案2】:

我们最终通过使用与How can I format numbers as money in JavaScript? 答案类似的想法“解决”了这个问题,虽然并不理想,但性能足够好并且在这个用例中是可以接受的。

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    相关资源
    最近更新 更多