【问题标题】:Float to bigint浮动到大整数
【发布时间】:2016-12-25 23:33:45
【问题描述】:

好的,所以我有这个浮点数:-

$floatval = '1.05143617E+18';

它的等效整数是:-

1051436170000000000

使用 php,我正在尝试将此浮点数转换为所需的整数值。

这是我的尝试:-

$floatval = '1.05143617E+18';
var_dump(convert($floatval));

function convert($floatval)
{
    $divided = explode('+', $floatval);
    $first = floatval($divided[0]);
    $second = intval($divided[1]);
    $final = intval($first * pow(10, $second));
    return $final;
}

输出:-

953738112

无论我尝试什么,输出都没有按要求出现。我在哪里做错了?

【问题讨论】:

  • 你的操作系统和 PHP 版本是什么?

标签: php


【解决方案1】:

试试这个

intval(floatval($floatval));

【讨论】:

    【解决方案2】:

    您似乎正在处理整数溢出问题,可能是因为您在 Windows 上运行 PHP 并且您的系统不支持 64 位整数。您可以通过使用 bcmath 扩展中的函数进行计算来避免此问题。如果您在 Windows 上运行,PHP 将内置对 bcmath 的支持,如文档 here 中所述。使用 bcmath,您的 convert 函数可以这样实现:

    function convert($floatval)
    {
        $divided = explode('E+', $floatval);
        $base = $divided[0];
        $exp = $divided[1];
        $final = bcmul($base, bcpow('10', $exp));
        return $final;
    }
    

    在没有整数溢出问题的不同系统上,其他基于强制转换的解决方案之一应该可以工作。

    【讨论】:

      【解决方案3】:
      $floatval = (float) '1.05143617E+18';
      $intval = (int) $floatval;
      var_dump($intval);
      

      输出:int(1051436170000000000)

      【讨论】:

      • 出于兴趣,` - 0` 完成了什么?
      • @jedifans 实际上你是对的。转换为 INT 不需要 0。0 将用于强制变量进入 INT 状态。你是对的。
      【解决方案4】:

      (int)(float)$floatval; 可以解决问题。

      【讨论】:

      • 不确定我为什么被否决。如果您希望您的特定解决方案起作用,请在 E 而不是 + 上展开。无论如何,这两种解决方案都不会超过 INT_MAX!
      • 您使用的是 32 位系统吗?
      • var_dump((int)(float)'1.05143617E+18'); on sandbox.onlinephpfunctions.com 给出int(1051436170000000000)
      • @RobertPuerco 你在你的系统上得到了什么?我感觉你正在运行 32 位,其中 INT_MAX 低于目前大多数服务器运行的 64 位系统。
      • 输出为:-int 953738240
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      相关资源
      最近更新 更多