如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如下面这种情况:
1 2 3 4
| echo intval(0.58*100);// 57 echo (int) (0.58*100);// 57 echo round(0.58*100); // 58 var_dump((0.1 + 0.7) == 0.8); // false
|
之所以出现上面的问题是因为PHP 是使用二进制表示浮点数的,这是支持二进制浮点数运算(绝大部分都是 IEEE-745浮点数表示法 的实现)的系统都存在一个现象(具体原因,想要知道的朋友可以点击这里查看)。
所以在浮点数转换整数的时候(比如微信支付接口支付金额需转换成单位)建议可以使用round()函数,或者计算的时候使用BC高精度函数。
常用的高精度函数如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| bcadd — 将两个高精度数字相加
bccomp — 比较两个高精度数字,返回-1, 0, 1
bcdiv — 将两个高精度数字相除
bcmod — 求高精度数字余数
bcmul — 将两个高精度数字相乘
bcpow — 求高精度数字乘方
bcpowmod — 求高精度数字乘方求模,数论里非常常用
bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
bcsqrt — 求高精度数字平方根
bcsub — 将两个高精度数字相减
|
使用方法举例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
var_dump(bccomp($left=4.45, $right=5.54, 2));
var_dump(bcadd($left=1.0321456, $right=0.0243456, 2));
var_dump(bcsub($left=1.0321456, $right=3.0123456, 2));
var_dump(bcdiv($left=6, $right=5, 2));
var_dump(bcmul($left=3.1415926, $right=2.4569874566, 2));
bcscale(3); var_dump(bcdiv('105', '6.55957'));
|