php高精度数据运算问题

 

在php中的加减运算中,会出现浮点数精度丢失的情况,例子如下:
 
 
<?php
$a = 35;
$b = 34.99;
echo $b;
echo '<br />';
echo json_encode($b);
echo '<br />';
echo ($a - $b);
echo '<br />';
echo bcadd($a,$b,6);
$c=2/3;
$b=1/3;
echo '<br />';
echo $c+$b;
?>

 运行结果如下:

相减之后出现了精度丢失的情况,查了网上无数的教程,有建议添加ini_set设置精度,测试如下

<?php
ini_set('precision', -1);
ini_set('serialize_precision', -1);
$a = 35;
$b = 34.99;
echo $b;
echo '<br />';
echo json_encode($b);
echo '<br />';
echo ($a - $b);
echo '<br />';
echo bcadd($a,$b,6);
$c=2/3;
$b=1/3;
echo '<br />';
echo $c+$b;
?>

 

添加后运行结果如图:发现并不好使,

 

后来查看php手册,其中对于这两个php初始化设置的介绍是这样的:

从说明中可以看出 precision是控制浮点数显示有效数字的位数,并不是控制小数点后多少位的,

同理,serialize_precision是控制序列化时,浮点数显示有效数据的位数。

然后再通过努力的查找,发现,php提供了一套高精度运算函数,亲测有效

 

在php的数据运算中会出现数据精度丢失的问题,但是php提供了一套函数,

PHP 为任意精度数学计算提供了二进制计算器(Binary Calculator),它支持任意大小和精度的数字,以字符串形式描述

bcadd — 加法
bccomp — 比较
bcdiv — 相除
bcmod — 求余数
bcmul — 乘法
bcpow — 次方
bcpowmod — 先次方然后求余数
bcscale — 给所有函数设置小数位精度
bcsqrt — 求平方根
bcsub — 减法

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2020-11-16 19:20  1450811640  阅读(347)  评论(0编辑  收藏  举报