【问题标题】:PHP Ambiguous Floating point issuePHP不明确的浮点问题
【发布时间】:2016-08-05 06:18:22
【问题描述】:

我一直在使用 Laravel 5.0 构建一个应用程序,并且在本地(宅基地内)一切正常。

但是,当我部署项目时,一些问题显而易见。其中之一涉及浮点数。

Homestead 是 PHP 5.6,而我的服务器是 5.5.9。当我在本地系统上查看价格时,它正确显示为 9.99。但是,在我的服务器上它不能正确显示,而是显示为 9.99000。

我的架构将价格字段设置为 float(12,5),因此额外的右填充也是必需的。

我的问题只是 PHP 5.5 和 5.6(甚至是 PDO/Eloquent)之间有什么区别会导致浮点问题?

【问题讨论】:

  • 负责输出这些值的代码是什么?
  • 这是标准的雄辩。如果我 {{ $product->price}} php 5.5 将显示 9.99000 而 php 5.6 将显示 9.99
  • RDBMS 版本从开发到生产是否也不同?
  • @Bogdan 两台服务器都使用Mysql 5.7.9
  • 逻辑起点是 PDO,因为它是负责处理特定信息的层(因为 Eloquent 与数据库无关,并且 MySQL 版本相同,从逻辑角度来看,问题应该出在PHP端)。明天我会看一下,看看我是否可以重现它(除非在那之前有人解释)。

标签: php pdo floating-point


【解决方案1】:

导致这种情况的 PHP 版本之间没有区别。但是,不同的 mysql 驱动程序之间存在差异,这可能会导致您看到的问题。

Homestead 安装了php5-mysqlnd,即“MySql Native Driver”。使用此驱动程序时,从数据库中获取的浮点数和整数将在 PHP 中分配为数字数据类型。如果您不使用本机驱动程序 (php5-mysql),则从数据库中获取的浮点数和整数将在 PHP 中分配为字符串。

以下代码演示了这会如何影响您的输出:

$f = 9.99000;
$s = "9.99000";

echo $f; // shows 9.99
echo $s; // shows 9.99000

您可以使用命令php -i | grep mysqlnd 来检查服务器是否正在使用本机驱动程序。这只是在您的phpinfo() 中搜索有关本机驱动程序的任何提及。如果这没有返回任何内容,那么您没有使用本机驱动程序,并且您的数字数据将作为字符串返回。

如果您没有安装本机驱动程序,则需要删除旧驱动程序并安装新驱动程序:

apt-get remove php5-mysql

apt-get install php5-mysqlnd

假设这首先是您的问题,这将解决它。您也可以查看this question and answer 了解更多信息。

【讨论】:

  • 哇,谢谢。我在这里学到了一些新东西,感谢您提供的链接,我希望我能找到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
相关资源
最近更新 更多