PHPExcel在我的服务器上改变舍入行为-寻求调试建议

PHPExcel在我的服务器上改变舍入行为-寻求调试建议,php,floating-point,phpexcel,rounding,Php,Floating Point,Phpexcel,Rounding,我的服务器上有一个奇怪的错误,实例化PHPExcel对象会导致相同的舍入操作返回不同的结果。我正在寻找如何调试它的想法,以便找到解决问题的升级路径。搜索PHP变更日志并没有提到这个问题 考虑以下代码: include 'vendor/phpoffice/phpexcel/Classes/PHPExcel.php'; $old = round(0.6164,4); $excel = new \PHPExcel(); $new = round(0.6164,4); debug_zval_du

我的服务器上有一个奇怪的错误,实例化PHPExcel对象会导致相同的舍入操作返回不同的结果。我正在寻找如何调试它的想法,以便找到解决问题的升级路径。搜索PHP变更日志并没有提到这个问题

考虑以下代码:

include  'vendor/phpoffice/phpexcel/Classes/PHPExcel.php';

$old = round(0.6164,4);

$excel = new \PHPExcel();

$new = round(0.6164,4);
debug_zval_dump($old, $new);
以下是我的服务器(64位Linux)上的输出:

无法在本地计算机(Win64)上复制:


我对这种行为感到非常困惑,因为这些低级细节应该被抽象掉,对吗?熟悉PHP内部结构的人可以对这里可能发生的情况发表意见吗?

PHPExcel计算引擎修改了PHP.ini中的
精度设置,在32位系统上设置为12,如果定义为较低的值,则在64位系统上设置为16


当PHPExcel对象未设置时,将恢复此设置

您正在进行字符串->浮点->字符串转换。您将失去精度,因为字符串可能是精确的,而float本质上永远不会精确。这与PHP或PHPExcel无关,而与“真实世界”中浮点数的行为有关。欢迎来到浮点数的世界。这几乎是所有地方的标准行为。我不是在讽刺,也不是在开玩笑。查看启动程序的巨大红色警告框。这也不仅仅是php的问题。几乎所有的编程语言都有相同的问题。你能解释一下为什么包含一个看似不相关的对象(PHPExcel实例)会导致在不同平台上进行第二轮操作的不同行为吗?我只是猜测,包含一个大脚本会引入一些类似滞后的东西。没有phpExcel特定的内容。当转换为字符串时,使用类似sprintf的
sprintf('%.4f',$float)
可能会获得更好的结果。基于32位或64位的不同平台/系统之间的精度设置可能会有所不同,并且有文档记录。从手册中可以看出:
浮点数的大小取决于平台。
。感谢您的解释。
$php -v
PHP 5.4.11 (cli) (built: Jan 16 2013 16:51:38)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
$ php test.php
string(6) "0.6164" refcount(2)
string(18) "0.6163999999999999" refcount(2)
$ php -v
PHP 5.4.11 (cli) (built: Jan 16 2013 20:26:43)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
$ php test.php
string(6) "0.6164" refcount(2)
string(6) "0.6164" refcount(2)