【问题标题】:incorrect number from scientific notation in PHPPHP中科学计数法中的数字不正确
【发布时间】:2016-02-09 09:53:21
【问题描述】:

我正在从包含长数字 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 尚未实现),就不可能从那里得到原始的32486509223273700000。甚至 Javascript 也会给你一个不同的数字。
  • @deceze 是的,我刚刚意识到它是不同的。

标签: php math floating-point scientific-notation


【解决方案1】:

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

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

【讨论】:

  • 没有“外推”——只有转换。 32486509223274000384 是最接近 3.2486509223274e19 的 53 位二进制浮点数的精确十进制值。另外,请小心使用“区间”这个词,因为这不是区间算术。
  • 当然你也可以称它为 SWAG。但是,由于它是空信息的延续,因此在扩展意义上,它也是外推。 ——我在一般数学意义上使用“区间”。在某种意义上,浮点算术是——即使不完美——区间算术。
  • 转换是明确定义的。 3.2486509223274E+19 转换为 1.1100001011010111010001000000010010000101101100101011 * 2^64,这正是 32486509223274000384。即使从小数点输入的角度来看,您得到的每个数字都确实存在。>
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    精度=30

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多