如何解决PhpExcel额外的小数点错误?
我正在使用PHPExcel进行客户端项目。 有这个错误我一直在面对额外的小数位是随机添加一些单元格,而阅读Excel文件。 例如,而不是56.25
,我得到56.24999999999
。 我已经将这个问题追溯到PHPExcel本身,我花了很多时间浏览文档,但是我还没有find任何可以解决这个问题的方法。 我不能把数字四舍五入到一个给定的小数点,因为它随机发生,不同的单元格有不同的小数点数字。 请帮忙!!!
编辑:关键是小数点保持完全一样,他们是手动input。 所以如果客户端在一个单元中手动input34.25,然后在其他单元中input51.3456,他们应该保持完全一样! 所以四舍五入并不是这里理想的解决scheme。
在阅读Mark Baker的评论之后,
这些不是随机的。 十进制浮点值不能总是精确地表示在使用二进制表示的计算机上….这不是一个PHPExcel问题,甚至PHP问题….这是一个logging完备的数字计算机问题; 和格式的解决scheme由sprint()或number_format()提供 –
我发现确保所有数字都保存为文本解决了这个问题。 PHP会将它们读作string,因此它的奇怪的浮点模糊不会成为问题。
看看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 ?>
我也注意到了这一点。 对我来说最快捷的解决scheme是PHPExcel/Calculation.php
文件中的一个小修改:
去PHPExcel/Calculation.php
更改$setPrecision = (PHP_INT_SIZE == 4) ? 14 : 16;
$setPrecision = (PHP_INT_SIZE == 4) ? 14 : 16;
像一个低值
$setPrecision = (PHP_INT_SIZE == 4) ? 4 : 4;