【问题标题】:PDO FetchAll() Number Rounding IssuePDO FetchAll() 数字舍入问题
【发布时间】:2013-06-06 11:09:47
【问题描述】:

我正在使用 PDO 在 MSSQL 数据库上执行存储过程。除了PDOStatement::fetchAll() 的一个小故障之外,一切都非常出色。从存储过程返回浮点数时,不是返回正确的值和小数位,而是返回带有额外小数位的值,如下所示:

Database | Returned by PDO
-----------------------------------
614.9    | 614.89999999999998
1.18     | 1.1799999999999999

似乎存在四舍五入的问题...我不明白它为什么要对数字进行四舍五入,当然它应该只是从数据库中获取它出现的值?

我试过了:

  1. 在 DB 上运行存储过程,这绝对可以正常工作,因此它肯定与 PDO 有关。
  2. 运行普通查询(而不是存储过程),这仍然会产生相同的结果。

显然我可以自己格式化数字,但这无关紧要,因为我必须确保我从数据库中得到的正是数据库中的!

【问题讨论】:

  • 你确定不是反过来吗?您在“数据库”中看到的内容是四舍五入的?
  • 该列的数据类型是什么?
  • @OneTrickPony 说的很对!!我怎么知道?
  • @YogeshSuthar 浮点数 53
  • 尝试插入 4.214.1999999 并检查两种情况下的 PDO /“数据库”返回什么

标签: php sql-server pdo fetchall


【解决方案1】:

也许问题是浮点数是如何在 PHP 内部存储的?尝试阅读in official docs

统一更新: 您也可以使用PDOStatement::bindColumn 将结果列指定为字符串(PDO::PARAM_STR),但我没有检查。

【讨论】:

  • 这很有趣,可能是这个,我会研究一下。谢谢
  • 我已经尝试了这两种建议,遗憾的是都没有解决这个问题。我相信这与微软如何处理浮点数有关
  • 您能否修复您的例程以将返回值转换为字符串(如果您可以选择的话)?
  • 这是我研究过的,它可以工作,但是由于这个 SP 返回超过 500 个字段,它不是很实用......我将使用 PHP 来格式化我的数字......
  • 您可以对这两种解决方案进行基准测试并在此处发布吗?我会非常感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多