Как исправить ошибку дополнительных десятичных точек PhpExcel?

я использую PHPExcel для клиентского проекта, над которым я работаю. Я столкнулся с этой ошибкой, когда дополнительные десятичные разряды добавляются случайным образом для некоторых ячеек при чтении файла Excel. Например, вместо 56.25, Я получил 56.24999999999, Я проследил эту проблему до самого PHPExcel и провел много времени, просматривая документацию, но я не нашел ничего, что могло бы решить эту проблему. Я не могу просто округлить числа до заданной десятичной точки, потому что это происходит случайным образом, и разные ячейки имеют числа с разными десятичными точками. Пожалуйста помоги!!!

РЕДАКТИРОВАТЬ: очень важно, чтобы десятичные точки остались в точности, как они были введены вручную. Так что, если клиент вручную вводит 34,25 в одной ячейке, а затем 51,3456 в другой ячейке, они должны оставаться именно такими! Таким образом, округление не является идеальным решением здесь.

3

Решение

Прочитав комментарий Марка Бейкера,

Это не случайно; десятичные значения с плавающей точкой не всегда могут быть представлены точно на
компьютеры, которые используют двоичное представление … это не проблема PHPExcel или даже проблема PHP … это хорошо документированная проблема с цифровым компьютером; а решения для форматирования предоставляются sprint () или number_format () —

Я обнаружил, что проверка того, что все цифры сохранены в виде текста, решает эту проблему. PHP будет читать их как строки, поэтому его странные махинации с плавающей запятой не будут проблемой.

1

Другие решения

Проверять, выписываться http://www.php.net/manual/en/function.round.php

echo round(56.24999999999, 2);

Выход будет 56.25

РЕДАКТИРОВАТЬ Попробуйте использовать эту пользовательскую функцию http://www.php.net/manual/en/function.round.php#102641

<?php
function round_up ( $value, $precision ) {
$pow = pow ( 10, $precision );
return ( ceil ( $pow * $value ) + ceil ( $pow * $value - ceil ( $pow * $value ) ) ) / $pow;
}

echo round_up(56.24999999999, 2);  // 56.25

?>
0

Я тоже это заметил. Самым быстрым решением, которое сработало для меня, была небольшая модификация в PHPExcel/Calculation.php файл:

Идти к PHPExcel/Calculation.php

+ Изменить $setPrecision = (PHP_INT_SIZE == 4) ? 14 : 16; в низкое значение, как

$setPrecision   = (PHP_INT_SIZE == 4) ? 4 : 4;
0
По вопросам рекламы [email protected]