我的服务器上有一个奇怪的错误,实例化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):
$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)
我无法在本地计算机上重现(Win64):
$ 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)
我对这种行为感到很困惑,因为这种低级别的细节应该抽象出来,对吗?熟悉PHP内部人员的人是否可以评论可能发生的事情?
答案 0 :(得分:1)
PHPExcel Calculation Engine修改了php.ini中的precision
设置,在32位系统上将其设置为12,如果定义为较低值,则在64位系统上设置为16。
取消设置PHPExcel对象时,将恢复此设置