网站首页 文章专栏 php数值运算的精度问题(超级大坑)

php数值运算的精度问题(超级大坑)

编辑时间:2019-09-30 10:04:29 作者:苹果 浏览量:1899


    前言:切记,进行php的数值运算,不用使用简单的+、-,*、/,一旦跟精度沾边,简单的运算符会给你埋下巨大的坑


 

在某些数值计算时,float 显示的是一个近似值,float转换成int时去掉尾数取整,也就是向下取整,会出现取值误差

举例说明:

    function test(){
        var_dump(0.58*100);  //float 58
        var_dump(intval(0.58*100));  //int 57
    
        var_dump(bcmul(0.58,100));  //string '58'
        var_dump(intval(bcmul(0.58,100)));  //int 58
    }
    test();



为什么 0.58*100 转整形会变成57?我们用var_export看下  (var_export()会一直保留着结构化形式存储数据)

            var_export(0.58*100);  //57.99999999999999    float转换成int时去掉尾数取整





为解决这一问题,php提供了一个精度扩展库,BC Math

    常用的函数有:

        bcadd — 将两个高精度数字相加
        bcsub — 将两个高精度数字相减
        bcmul — 将两个高精度数字相乘
        bcdiv — 将两个高精度数字相除
        bccomp — 比较两个高精度数字,返回-1, 0, 1
        bcmod — 求高精度数字余数(取模)
        bcpow — 求高精度数字乘方
        bcpowmod — 求高精度数字乘方求模,数论里非常常用
        bcscale — 设置所有bc数学函数的默认小数点保留位数
        bcsqrt — 求高精度数字平方根



特别建议:养成好习惯,遇到数值运算,直接使用精度行数,不要留下个隐性bug,害人害己。


    出自:何冰华个人网站

    地址:https://www.hebinghua.com/

    转载请注明出处


来说两句吧
最新评论