• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • bcdiv()

    (PHP 4, PHP 5, PHP 7)

    2个任意精度的数字除法计算

    说明

    bcdiv(string $left_operand,string $right_operand[,int $scale= int]): string

    左操作数除以右操作数

    参数

    $left_operand

    左操作数,字符串类型

    $right_operand

    右操作数,字符串类型

    $scale

    此可选参数用于设置结果中小数点后的小数位数。也可通过使用bcscale()来设置全局默认的小数位数,用于所有函数。

    返回值

    返回结果为字符串类型的结果,如果右操作数是0结果为null

    范例

    bcdiv()示例

    <?php
    echo bcdiv('105', '6.55957', 3);  // 16.007
    ?>
    

    参见

    • bcmul()2个任意精度数字乘法计算
    The custom bcdiv function listed at the top of this page produces very different results from bcdiv, as it rounds instead of truncating the result. Consider the following:
    <?php
    function bcdiv_cust( $first, $second, $scale = 0 )
    {
      $res = $first / $second;
      return round( $res, $scale );
    }
    echo bcdiv('1','2','0') . " vs. " bcdiv_cust('1','2','0'); // prints '0 vs. 1'
    ?>
    
    Perhaps some one can find useful this function to compute the modular inverse of a integer (extended euclidean algorithm):
     function invmod($a,$b) {
      $n=$b;
      $x=0; $lx=1; $y=1; $ly=0;
      while ($b) {
       $t=$b;
       $q=bcdiv($a,$b,0);
       $b=bcmod($a,$b);
       $a=$t;
       $t=$x; $x=bcsub($lx,bcmod(bcmul($q,$x),$n)); $lx=$t;
       $t=$y; $y=bcsub($ly,bcmod(bcmul($q,$y),$n)); $ly=$t;
      }
      if (bccomp($lx,0) == -1)
       $lx=bcadd($lx,$n);
      return $lx;
     }
     // verify
     $n="2447995268898324993537772139997802321";
     $t="64941057316178801556773346239351236811";
     $m="123456789";
     $i=invmod($t,$n);
     // (t*m)*inv(t) is m
     echo bcmod(bcmul(bcmod(bcmul($t,$m),$n),$i),$n) == $m;
    <?php
     //converting in to required precision of decimal points
    $result= bcdiv(89.99999999997,2.57865741235478,2);
     echo "$result"; // 34.90 result with 2 decimal points
    ?>
    
    Decimal to binary conversion, using BC Math.
    Note: this function is VERY slow if the decimal number is too big!
    <?
    function bc_decbin($dec_str) {
      if (strlen($dec_str)>0) {
        $bin_str = '';
        do {
          if (((int)$dec_str[strlen($dec_str)-1] % 2) === 0)
            $bin_str .= '0';
          else
            $bin_str .= '1';
          
          $dec_str = bcdiv($dec_str, '2');
        } while ($dec_str!='0');
        
        return strrev($bin_str);
      }
      else
        return null;
    }
    ?>
    -----
    Cristian
    www.CodeFlower.com

    上篇:bccomp()

    下篇:bcmod()