先介绍一下当前使用的环境。同学们可以比较一下,看本篇文章是否可以提供帮助。
docker 部署
- nginx 1.24
- php 8.1-fpm
再介绍一下框架,使用的是 "laravel 9.33.0"
其实这里跟 laravel 框架和 nginx 是没太多关系的,因为我们主要是使用 php 的扩展函数 bcmath
主要就是列出来,好区分一下环境,了解更多。或许有时候 就会存在一些我们认为不可能,结果就是如此的事情。
bc函数,除了 bcadd 还有其他的, bcadd 的意思是指 两个数字 相加,那么有相加,就有相减,相乘,相除...
先将相关的 bc函数 列出来
- bcadd 两个任意精度数字相加
- bccomp 比较两个任意精度的数字,结果 1,0,-1
- bcdiv 两个任意精度的数字除法计算
- bcmod 对一个任意精度数字取模
- bcmul 两个任意精度数字乘法计算
- bcpow 任意精度数字的乘方
- bcpowmod 先乘方,再取模
- bcscale 设置所有bc数学函数的默认小数点保留位数
- bcsqrt 任意精度数字的二次方根
- bcsub 两个任意精度数字相减
场景:
我在做 订单金额 计算的时候,考虑到精度问题,如果用常规的 100 + 20 - 7 这种,或许会出现一些精度问题,因为以前就遇到过。我明明计算并且返回的数据是 某金额 比如是 9.99元,json 数据返回给前端时,结果就出现 9.999999998 这样的数据给到前端了。前端不知所措,我更加不知所措。 原因是因为 编程语言对浮点数和大整数的运算,表示,存储方面都存在一定的问题。
所以,出现了 bcmath
关于 bcmath (Binary Calculator)
对于任意精度的数学,PHP提供了支持用字符串表示的任意大小和精度的数字的二进制计算,最多为 2147483647-1(或0x7FFFFFFF-1)。
那么我们就看一下 phpinfo 信息,配置是否支持。
很不巧,并没有 bcmath 相关的,所以我们在代码里使用 bcadd() 时,就会出现这样的错误:
Call to undefined function bcadd()
"Call to undefined function bcadd()" 翻译过来就是 "调用未定义函数 bcadd()"
我们需要解决的是,安装下载 bcmath 扩展包,这样就可以了。
因为用的是 docker,所以步骤如下:
1. 进入容器
docker exec -it CONTAINER ID bash
CONTAINER ID 这是容器的ID,也可以填写容器名称
查看容器 ID 和容器名称的命令:
docker ps
2. 执行安装
docker-php-ext-install -j$(nproc) bcmath
3. 退出容器,重启容器
exit
docker restart CONTAINER ID
然后我们再返回 phpinfo 查看一下
现在就能找到 bcmath 相关的了。
然后我们回到代码里,之前运行 bcadd 时,出现过 "Call to undefined function bcadd()"
那么我们现在执行看一下:
到此 就解决了 "Call to undefined function bcadd()" 的问题