zoukankan      html  css  js  c++  java
  • php浮点数计算问题

    如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如echo intval( 0.58*100 );会打印57,而不是58,这个其实是计算机底层二进制无法精确表示浮点数的一个bug,是跨语言的,我用python也遇到这个问题。所以基本上大部分语言都提供了精准计算的类库或函数库,比如php有BC高精确度函数库,下面介绍一下一些常用的BC高精确度函数使用。 

    php BC高精确度函数库包含了:相加,比较,相除,相减,求余,相乘,n次方,配置默认小数点数目,求平方。这些函数在涉及到有关金钱计算时比较有用,比如电商的价格计算。

    /**
      * 两个高精度数比较
      * 
      * @access global
      * @param float $left
      * @param float $right
      * @param int $scale 精确到的小数点位数
      * 
      * @return int $left==$right 返回 0 | $left<$right 返回 -1 | $left>$right 返回 1
      */
    var_dump(bccomp($left=4.45, $right=5.54, 2));
    // -1
      
     /**
      * 两个高精度数相加
      * 
      * @access global
      * @param float $left
      * @param float $right
      * @param int $scale 精确到的小数点位数
      * 
      * @return string 
      */
    var_dump(bcadd($left=1.0321456, $right=0.0243456, 2));
    //1.04
     
      /**
      * 两个高精度数相减
      * 
      * @access global
      * @param float $left
      * @param float $right
      * @param int $scale 精确到的小数点位数
      * 
      * @return string 
      */
    var_dump(bcsub($left=1.0321456, $right=3.0123456, 2));
    //-1.98
      
     /**
      * 两个高精度数相除
      * 
      * @access global
      * @param float $left
      * @param float $right
      * @param int $scale 精确到的小数点位数
      * 
      * @return string 
      */
    var_dump(bcdiv($left=6, $right=5, 2));
    //1.20
     
     /**
      * 两个高精度数相乘
      * 
      * @access global
      * @param float $left
      * @param float $right
      * @param int $scale 精确到的小数点位数
      * 
      * @return string 
      */
    var_dump(bcmul($left=3.1415926, $right=2.4569874566, 2));
    //7.71
     
     /**
      * 设置bc函数的小数点位数
      * 
      * @access global
      * @param int $scale 精确到的小数点位数
      * 
      * @return void 
      */ 
    bcscale(3);
    var_dump(bcdiv('105', '6.55957')); 
    // 16.007
     
    注意点:关于设置的位数,超出部分是丢弃掉,而不是四舍五入
    

      

    暗夜之中,才见繁星;危机之下,暗藏转机;事在人为,为者常成。
  • 相关阅读:
    Android 3.0 r1 API中文文档(108) —— ExpandableListAdapter
    Android 3.0 r1 API中文文档(113) ——SlidingDrawer
    Android 3.0 r1 API中文文档(105) —— ViewParent
    Android 中文 API (102)—— CursorAdapter
    Android开发者指南(4) —— Application Fundamentals
    Android开发者指南(1) —— Android Debug Bridge(adb)
    Android中文API(115)——AudioFormat
    Android中文API(116)——TableLayout
    Android开发者指南(3) —— Other Tools
    Android中文API (110) —— CursorTreeAdapter
  • 原文地址:https://www.cnblogs.com/zenghansen/p/3990357.html
Copyright © 2011-2022 走看看