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

问题描述 投票:3回答:4

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

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

php excel floating-point phpexcel precision
4个回答
1
投票

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

这些不是随机的;十进制浮点值不能总是在使用二进制表示的计算机上精确表示....这不是PHPExcel问题,甚至是PHP问题....这是一个记录良好的数字计算机问题;格式化解决方案由sprint()或number_format()提供 -

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


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

?>

0
投票

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

PHPExcel/Calculation.php

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

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

0
投票

如果你的操作系统x86 PHP_INT_SIZE == 4是真的,那么你有一个操作系统x64。 16对OS x64来说太长了。在我的情况下,我有一个OS x64所以我改变了PHPExcel / Calculation.php

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

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

和工作!!!

© www.soinside.com 2019 - 2024. All rights reserved.