首页 > 解决方案 > PHP 将数字截断为最多 15 位,以实现与 MS Excel 中相似的精度

问题描述

嗨,我遇到了一个比较在 MS Excel 和 PHP 中计算的数字的问题。

如果我理解正确,我遇到的问题是 MS Excel 将截断最多 15 位的数字,因此我无法比较 PHP 和 MS Excel 结果:例如:

so 12.34567890123456789 would be truncated and equal to 12.34567890123450000,

或者

12345.67890123456789012345 would be truncated and equal 12345.67890123450000000

在 MS Excel 中。

我如何在 PHP 中实现相同的效果,以便将数字截断为最大 15 位?

我找到了使用函数bcdiv()的建议,它允许将数字截断到指定的小数位数,但是如果在函数中设置了超过 10 个小数位并且它不一样,则数字似乎在中间松散了数字如在 MS EXCEL 中:

测试

echo 123.4567890123456789;
echo bcdiv(123.4567890123456789, 1, 15); 

//结果

123.4567890123456789
123.4567890123500000000  // have lost digit 4 in the middle of the number

有谁知道如何在 PHP 中像在 EXCEL 中一样截断数字?

标签: phpexcelprecisiontruncate

解决方案


PHP 和 Excel 在内部都使用二进制 IEEE 754 双精度格式。但是,Excel 计算的数字不是它显示的数字。看:

https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel

因此,您可以强制 PHP 执行与 Excel 相同的奇怪操作,但仅限于显示数字时,而不是在使用它们进行计算时。

我发现 PHP 也舍入到大约 15 位数字,所以我不会费心去精确模拟 Excel 的输出,除非你有充分的理由这样做。

这个问题有点误导,因为在我测试它时会产生echo 123.4567890123456789;结果(PHP 5.6.36)。123.45678901235

数字 4 变成数字 5 的原因是 4 后面的数字,即“56789”,使 4 大于 4.5,因此四舍五入。所以数字4不会丢失。

更多来源:

http://php.net/manual/en/language.types.float.php

https://en.wikipedia.org/wiki/IEEE_754

https://support.microsoft.com/en-us/help/78113/floating-point-arithmetic-may-give-inaccurate-results-in-excel


推荐阅读