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

PHP中的科学记数法中的数字不正确,php,math,floating-point,scientific-notation,Php,Math,Floating Point,Scientific Notation,我正在从包含长数字ID字符串的电子表格中读取数据。我试图通过确保即使列格式被错误地设置为数字,数据也能正确读取来确保我的系统万无一失 因此,电子表格包含科学记数法中的数字32486509223273700000,即3.2486509223274E+19。在将其存储为字符串之前,我需要将其转换为原始值这就是问题所在。 我无法让PHP将科学符号转换回原始数字。使用各种方法将数字转换回原始数字,它似乎总是有不同的数字,而不是尾随的零 $i = 3.2486509223274E+19; echo $i;

我正在从包含长数字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

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

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


或者换句话说,
3.2486509223274E+19
表示大致从
3.24865092232739984E+19
3.24865092232740024E+19
的间隔。该区间内的任何整数都必须算作“正确”外推。

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


或者换句话说,
3.2486509223274E+19
表示大致从
3.24865092232739984E+19
3.24865092232740024E+19
的间隔。该区间内的任何整数都必须算作“正确”外推。

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

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

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

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

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

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

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

精度=30


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

精度=30


科学符号已经四舍五入了。如果没有千里眼(PHP还没有实现),就不可能从中恢复原来的
3248650922327370000
。甚至Javascript也会给你一个不同的数字。@deceze是的,我刚刚意识到它是不同的。科学符号已经四舍五入了。如果没有千里眼(PHP还没有实现),就不可能从中恢复原来的
3248650922327370000
。甚至Javascript也会给你一个不同的数字。@deceze是的,我刚刚意识到它是不同的。没有“外推”——只有转换。32486509223274000384是最接近3.2486509223274e19的53位有效二进制浮点数的精确十进制值。另外,要小心使用“interval”这个词,因为这不是interval算术。当然,你也可以称之为SWAG。然而,由于它是带有空信息的延续,因此从广义上讲,它也是外推。-我用的是一般数学意义上的“区间”。从某种意义上说,浮点运算是——即使不完美——区间运算。转换是定义良好的。3.2486509223274E+19转换为1.1100001011101011010000101101100101011*2^64,即32486509223274000384。你得到的每一个数字都是真实存在的,即使从十进制输入的角度来看,有些数字是无关紧要的。没有“外推”——只有转换。32486509223274000384是最接近3.2486509223274e19的53位有效二进制浮点数的精确十进制值。另外,要小心使用“interval”这个词,因为这不是interval算术。当然,你也可以称之为SWAG。然而,由于它是带有空信息的延续,因此从广义上讲,它也是外推。-我用的是一般数学意义上的“区间”。从某种意义上说,浮点运算是——即使不完美——区间运算。转换是定义良好的。3.2486509223274E+19转换为1.1100001011101011010000101101100101011*2^64,即32486509223274000384。你得到的每一个数字都在那里,即使从十进制输入的角度来看,有些数字是无关紧要的。