我正在使用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;
和工作!!