一、前言
我们在进行php
开发的时候经常会遇到浮点型的问题,特别是涉及金额的部分,常常需要进行加减运算。当小数点的位数比较多的时候,往往容易犯一些很低级的错误。这里记录一下php
的精度计算和封装的小demo
。
二、关于php的高精度问题
1、概念解释
这篇文章的解释最清楚:
2、高精度数值对比大小问题
下面这篇文章讲的很好:
默认保留两位小数
bcadd(参数1,参数2,参数3)
参数1 和2 是要相加的参数 3是保留几位小数。
1. bcadd 任意精度数的相加
2. bcsub 任意精度数的减法
3. bcmul 乘法, bcdiv除法
4. bcmod 取余数。 (比%功能更强大)
5. bcpow 幂函数运算
6. bcsqrt 平方根
7. sqrt 平方根运算
7. pow求幂
8. abs 求绝对值
9. pi 得到圆周率数值
10.bccomp — 比较
三、封装的小demo
//$m和$n代表传入的两个数值,主要就是这两个数值之间的比较 //$x代表传入的方法,比如是;add,sub等 //$scale 代表传入的小数点位数。这个根据需求更改即可 public function calc($m,$n,$x,$scale){ $errors=array( '被除数不能为零', '负数没有平方根' ); switch($x){ case 'add': $t=bcadd($m,$n,$scale); break; case 'sub': $t=bcsub($m,$n,$scale); break; case 'mul': $t=bcmul($m,$n); break; case 'div': if($n!=0){ $t=bcdiv($m,$n); }else{ return $errors[0]; } break; case 'pow': $t=bcpow($m,$n); break; case 'mod': if($n!=0){ $t=bcmod($m,$n); }else{ return $errors[0]; } break; case 'sqrt': if($m>=0){ $t=bcsqrt($m); }else{ return $errors[1]; } break; } return $t; }
调用方式:
$result= $this->calc(2.001,3.002,'sub',3);
结束!!!