我正在从包含长数字 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
。该区间内的任何整数都必须算作“正确”的外推法。
最简单的解决方案是将大数转换为浮点值:
$i = 3.2486509223274E+19;
echo printf ("%.0f", $i);
// output 3248650922327400038420
这可能看起来是一个稍微不正确的值,但正如 @LutzL 已经指出的那样,它是无法避免的。
php.ini 中有一个值称为 precision,它表示浮点数将显示多少位数字。 根据您的情况,将其设置为至少 21。 最好设置为 30
精度=30
我用 php 8.2 修复了它,因为它现在会抛出致命错误。
$num1 = "79.9645";
$num2_scientific = "1.1368683772162E-13";
// Convert the scientific notation to a decimal string
$num2_decimal = sprintf("%.15f", $num2_scientific);
$result = bcsub($num1, $num2_decimal, $scale);
echo $result;