PHP中的科学记数法中的数字不正确
我正在从包含长数字ID字符串的电子表格中读取数据。我试图通过确保即使列格式被错误地设置为数字,数据也能正确读取来确保我的系统万无一失 因此,电子表格包含科学记数法中的数字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;
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。你得到的每一个数字都在那里,即使从十进制输入的角度来看,有些数字是无关紧要的。