BC数学函数:PHP处理有关钱数等浮点数计算时高精确度函数库

在商城类的项目当中,避免不了钱数的计算,也就会出现所谓的浮点数精度问题,前两天阅文的小哥哥面试我的时候就问到了这个,Mysql怎么去存钱数?PHP又该怎么处理浮点数?

在数据库去存这些精确的数值的时候,我们会使用decimal去存储

我们使用PHP对浮点数进行加减乘除计算的时候,有时会遇到一些计算结果错误的问题,比如这样:

<?php
$num = 0.58;
var_dump(intval($num * 100));

会输出int(57),为什么输出57,PHP鸟哥对这个问题做了解释,感兴趣的可以看一下,地址:PHP浮点数的一个常见问题的解答 | 风雪之隅

PHP怎么去确保精确的数值呢?小哥哥告诉我PHP有个函数库,可以了解一下

BC是Binary Calculator的缩写

BC高精确度函数库,它包含了:相加,比较,相除,相减,求余,相乘,N次方,配置默认小数点数目,求平方

还以上面的例子为准,测试一下bcmul,2个任意精度数字的乘法计算

var_dump(bcmul('0.58', '100'));

这样就会输出string(2) "58",BC系列函数返回结果为字符串类型,但是结果也是准确的

对于第三个参数:scale,用于设置结果中的小数点后的小数位数

var_dump(bcmul('1.34747474747', '35', 3));

输出string(6) "47.161",保留3位小数,也就是第三个参数的作用了

其他的函数可以看一下PHP的手册

bcadd — 将两个高精度数字相加

bccomp — 比较两个高精度数字,返回-1, 0, 1

bcdiv — 将两个高精度数字相除

bcmod — 求高精度数字余数

bcmul — 将两个高精度数字相乘

bcpow — 求高精度数字乘方

bcpowmod — 求高精度数字乘方求模,数论里非常常用

bcscale — 配置默认小数点的位数,相当于linux的bc中的“scale=”

bcsqrt — 求高精度数字平方根

bcsub — 将两个高精度数字相减

阅文面试的小哥哥,人也是很不错的,对于我不了解或者不熟悉的知识也给予了指导,也很感谢这个小哥哥 😆

这句话共勉吧:梦想不是浮躁,而是沉淀和积累

6 条评论

发表评论

*