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   1450811640  阅读(385)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示