我正在使用PHPExcel作为我正在处理的客户项目。我遇到过这个错误,在读取excel文件时,某些单元格会随机添加额外的小数位。例如,我得56.25
而不是56.24999999999
。我已经将此问题追溯到PHPExcel本身并且我花了很多时间查看文档,但我还没有找到任何可以解决此问题的方法。我不能将数字四舍五入到给定的小数点,因为它是随机发生的,不同的单元格具有不同小数点的数字。请帮忙!!!
编辑:小数点保持与手动输入完全相同至关重要。因此,如果客户端在一个单元格中手动输入34.25,而在另一个单元格中手动输入51.3456,则它们应该保持完全相同!因此,四舍五入不是理想的解决方案。
答案 0 :(得分:1)
阅读Mark Baker的评论后,
这些不是随机的;十进制浮点值不能总是精确表示 使用二进制表示的计算机....这不是PHPExcel问题,甚至是PHP问题....它是一个记录良好的数字计算机问题;格式化解决方案由sprint()或number_format() -
提供
我发现确保所有数字都保存为文本可以解决这个问题。 PHP将它们作为字符串读取,因此它奇怪的浮点诡计不会成为问题。
答案 1 :(得分:0)
查看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
?>
答案 2 :(得分:0)
我也注意到了这一点。对我有用的最快解决方案是PHPExcel/Calculation.php
文件中的一个小修改:
转到PHPExcel/Calculation.php
将$setPrecision = (PHP_INT_SIZE == 4) ? 14 : 16;
更改为低值,例如
$setPrecision = (PHP_INT_SIZE == 4) ? 4 : 4;
答案 3 :(得分:0)
如果您的操作系统为x86,则PHP_INT_SIZE == 4为true,否则,您的操作系统为x64。 16对于OS x64太长。 就我而言,我的操作系统是x64,因此我更改了PHPExcel / Calculation.php
$setPrecision = (PHP_INT_SIZE == 4) ? 14 : 16;
TO
$setPrecision = (PHP_INT_SIZE == 4) ? 14 : 14;
工作吧!