如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如echo intval( 0.58*100 );会打印57,而不是58

这个其实是计算机底层二进制无法精确表示浮点数的一个bug,是跨语言的

可以用精度函数库解决问题

bcadd — 将两个高精度数字相加

bccomp — 比较两个高精度数字,返回-1, 0, 1

bcdiv — 将两个高精度数字相除

bcmod — 求高精度数字余数

bcmul — 将两个高精度数字相乘

bcpow — 求高精度数字乘方

bcpowmod — 求高精度数字乘方求模,数论里非常常用

bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”

bcsqrt — 求高精度数字平方根

bcsub — 将两个高精度数字相减
比较两个高精度数字
var_dump(bccomp($left=4.45, $right=5.54, 2));
// -1

两个高精度数相加
var_dump(bcadd($left=1.0321456, $right=0.0243456, 2));
//1.04

两个高精度数相减
var_dump(bcsub($left=1.0321456, $right=3.0123456, 2));
//-1.98

两个高精度数相除
var_dump(bcdiv($left=6, $right=5, 2));
//1.20

两个高精度数相乘
var_dump(bcmul($left=3.1415926, $right=2.4569874566, 2));
//7.71
设置bc函数的小数点位数
bcscale(3);
var_dump(bcdiv(‘105’, ‘6.55957’));
// 16.007

PHP float加减乘除

Comments are closed.

Post Navigation