【问题标题】:Convert exponential number to decimal in php在php中将指数数转换为十进制
【发布时间】:2010-12-16 13:53:26
【问题描述】:

我有一个指数格式的浮点数,即4.1595246940817E-17,我想将其转换为十进制数,如 2.99 等。

我们将不胜感激。

format_number()sprintf() 似乎不适合我。

【问题讨论】:

  • 指数或十进制只是显示数字的人类可读形式的方式。我不太确定你想要什么..
  • 我不知道 2.99 来自哪里(您可能想告诉我们您真正期望什么),但您是否期待 number_format(4.1595246940817E- 17, 2) 产生 4.15?如果是这样,您的计算将偏离多个数量级(正确的结果将是 0.00)。
  • 是的,我预计 4.1595246940817E-17 会产生 2.99。这是我的情况。分配大小:65536 字节 = 65536/1024 = 64KB。分配单位:49107。总大小= 49107*64 = 3142848KB = 3069.18MB= 2.99GB
  • 这是我的代码
    <?php $au = 65536; //分配单元大小 ib 字节 $auk = $au / 1024; //分配单元大小,KB $totalSize = (49107*$auk)/(1024*1024);回声 $totalSize; ?>
    这会产生 2.99,但如果我从注册表/snmp 陷阱等获取实时值。那么它会产生 4.1595246940817E-17。
  • 那和你的问题完全不同。试试下面 ajreal 和 Russell Dias 给出的解决方案

标签: php floating-point decimal


【解决方案1】:

您需要更好的数学扩展,例如 BC Math, GMP... 来处理更精确的精度。

floating number & integer的限制

【讨论】:

  • 是的,我预计 4.1595246940817E-17 会产生 2.99。这是我的情况。分配大小:65536 字节 = 65536/1024 = 64KB。分配单位:49107。总大小= 49107*64 = 3142848KB = 3069.18MB= 2.99GB
  • @user544836 - 这是数学吗?如果是这样,请尝试数学扩展,如果 NOT ...不确定可以做什么
  • @Saqib - ic,你应该这样做 php -r "echo 49107*64/1024/1024;",预设 Gb 而不是让它溢出...
【解决方案2】:

使用BC Math 库,您可以将bcscale() 数字设置为预定的小数,这为将来需要算术精度的计算设置参数。

bcscale(3);
echo bcdiv('105', '6.55957'); // 16.007

【讨论】:

    【解决方案3】:

    你可以去掉小数点($x 是你的数字):

    $strfloat = strtolower((string)($x));
    $nodec = str_replace(".", "", $x);
    

    然后提取指数部分。

    list($num, $exp) = explode("e", $nodec);
    $exp = intval($exp);
    

    然后你有小数点和数字,所以你可以格式化它:

    if($exp < 0) return "0." . ("0" * -($exp + 1)) . $num;
    if($exp == 0) return (string)$x;
    if($exp > 0) return $num . ("0" * $exp);
    

    但这并没有增加精度,只是额外的零。

    【讨论】:

      【解决方案4】:

      根据 ajreal 和 Russell Dias 的建议,这是使用 BC Math 的解决方案:

      $au = 65536; 
      $auk = bcdiv($au, 1024);
      $totalSize = bcdiv(bcmul(49107, $auk), bcpow(1024, 2), 2); 
      echo $totalSize . "\n"; 
      
      // echos 2.99
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-07
        • 2015-06-25
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        相关资源
        最近更新 更多