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

问题描述 投票:0回答:4

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

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

php math floating-point scientific-notation
4个回答
2
投票

请注意,

double
浮点格式的精度约为 15.5 位小数。所有其他显示的小数都是推断的。一如既往,推断是一个危险的游戏。

或者换句话说,

3.2486509223274E+19
代表一个区间,大致从
3.24865092232739984E+19
3.24865092232740024E+19
。该区间内的任何整数都必须算作“正确”的外推法。


2
投票

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

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

这可能看起来是一个稍微不正确的值,但正如 @LutzL 已经指出的那样,它是无法避免的。


0
投票

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

精度=30


0
投票

我用 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;
© www.soinside.com 2019 - 2024. All rights reserved.