PHP中科学记数法的数字不正确

时间:2016-02-09 09:53:22

标签: php math floating-point scientific-notation

我正在从包含长数字ID字符串的电子表格中读取数据。即使将列格式错误地设置为数字,我也要确保数据正确读取,从而使我的系统变得万无一失。

因此,电子表格包含科学计数法中的数字32486509223273700000 3.2486509223274E+19。在我将其存储为字符串之前,我需要将其转换为原始值。 这就是问题所在。

我无法让PHP将科学记数法转换回原始数字。使用各种方法将数字转换回原始数字,它似乎总是有不同的数字而不是尾随零

$i = 3.2486509223274E+19;
echo $i; //32486509223274000384
echo number_format($i,0,'',''); //32486509223274000384
echo sprintf('%0.0f', $i); //32486509223274000384

请注意,我打算将最终结果存储为字符串。

3 个答案:

答案 0 :(得分:2)

请注意,double浮点格式的精度约为15.5位小数。所有其他显示的小数都是外推的。和往常一样,外推是一种危险的游戏。

或换句话说,3.2486509223274E+19代表一个间隔,大致从3.24865092232739984E+193.24865092232740024E+19。该区间中的任何整数都必须计为"正确"外推。

答案 1 :(得分:2)

最简单的解决方案是将大数字转换为浮点值:

$i = 3.2486509223274E+19;
echo printf ("%.0f", $i);
// output 3248650922327400038420

这似乎是一个稍微不正确的值,但是@LutzL已经指出它是无法避免的。

答案 2 :(得分:0)

php.ini中有一个名为 precision 的值,它为浮点数显示的位数。 在你的情况下,将它设置为至少21。 最好将其设置为30

  

精度= 30