У меня странная ошибка на моем сервере, когда создание экземпляра объекта 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, прокомментировать, что здесь происходит?
Механизм расчета PHPExcel изменил precision
установка из php.ini, установка 12 в 32-битных системах, 16 в 64-битных системах, если оно определено как более низкое значение.
Этот параметр восстанавливается, когда объект PHPExcel не установлен
Других решений пока нет …