如何修复PhpExcel额外的小数点错误?

时间:2016-01-28 07:18:48

标签: php excel floating-point phpexcel precision

我正在使用PHPExcel作为我正在处理的客户项目。我遇到过这个错误,在读取excel文件时,某些单元格会随机添加额外的小数位。例如,我得56.25而不是56.24999999999。我已经将此问题追溯到PHPExcel本身并且我花了很多时间查看文档,但我还没有找到任何可以解决此问题的方法。我不能将数字四舍五入到给定的小数点,因为它是随机发生的,不同的单元格具有不同小数点的数字。请帮忙!!!

编辑:小数点保持与手动输入完全相同至关重要。因此,如果客户端在一个单元格中手动输入34.25,而在另一个单元格中手动输入51.3456,则它们应该保持完全相同!因此,四舍五入不是理想的解决方案。

4 个答案:

答案 0 :(得分:1)

阅读Mark Ba​​ker的评论后,

  

这些不是随机的;十进制浮点值不能总是精确表示   使用二进制表示的计算机....这不是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;

工作吧!