网站首页 文章专栏 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,害人害己。
转载请注明出处