嗨,我遇到了比较在 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 个小数位并且它与在女士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 中一样截断数字?
最佳答案
PHP 和 Excel 在内部都使用二进制 IEEE 754 double 格式。但是,Excel 计算的数字不是它显示的数字。看:
https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel
因此,您可以强制 PHP 执行与 Excel 相同的奇怪操作,但仅限于显示数字时,而不是在使用它们进行计算时。
我发现 PHP 也舍入到大约 15 位数字,所以我不会费心去精确模拟 Excel 的输出,除非你有充分的理由这样做。
这个问题有点误导,因为 echo 123.4567890123456789;
在我测试时会产生 123.45678901235
(PHP 5.6.36)。
数字 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
关于PHP 将数字截断为最多 15 位,以实现与 MS Excel 中相似的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51290766/