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


How to fix PhpExcel extra decimal points bug?

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

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

在阅读了马克贝克的评论后,

这些不是随机的;十进制浮点值不能总是完全表示在 使用二进制表示的计算机...。这不是 PHPExcel 的问题,甚至不是 PHP 的问题。这是一个有据可查的数字计算机问题;格式化的解决方案由 sprint() 或 number_format() 提供 –

我发现确保所有数字都保存为文本可以解决这个问题。PHP 会将它们读取为字符串,因此其奇怪的浮点恶作剧不会成为问题。

我也注意到了这一点。对我有用的最快解决方案是对PHPExcel/Calculation.php文件进行小修改:

转到PHPExcel/Calculation.php

$setPrecision = (PHP_INT_SIZE == 4) ? 14 : 16;更改为低值,例如

$setPrecision   = (PHP_INT_SIZE == 4) ? 4 : 4;

查看 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
?>

如果你有OS x86 PHP_INT_SIZE==4,那么它是正确的,否则你就有一个OS x64。16 对于 OS x64 来说太长了。就我而言,我有一个OS x64,所以我更改了PHPExcel/Computing.php

$setPrecision = (PHP_INT_SIZE == 4) ? 14 : 16;

$setPrecision = (PHP_INT_SIZE == 4) ? 14 : 14;

和工作!!