如何避免PHP浮点数引起的bug

追格官方小助手/ 2022年11月07日/ PHP/ 浏览 1567

人生就是一个坑,接着一个坑…… 写程序(bug)也是……


由于种种原因,在代码中使用浮点数要非常小心,经常会发生这样那样的问题。


所以,前辈们也总结了各种各样规避浮点数坑的方法。


1、通过乘100的方式转化为整数加减,然后在除以100转化回来。这个方法的缺陷就是只能照顾两位小数的浮点数。


2、使用number_format转化成 字符串 ,然后在使用(float)强转回来。这个方法的缺陷是转成字符串之后,没法进行加减乘除运算。


3、php提供了高精度计算的函数库,实际上就是为了解决这个浮点数计算问题而生的。这才是正经的解决办法。


高精度浮点数函数库(BCMath),包括以下函数:


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


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


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


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


bcmod — 求高精度数字 余数


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


bcpow — 求高精度数字 乘方


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


bcsqrt — 求高精度数字平方根


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


使用举例:


// 指定保存两位小数
bcscale(2);

// 3.30
echo bcadd(1.1, 2.2);

// -1.10
echo bcsub(1.1, 2.2);

// -1
echo bccomp(1.1, 2.2);

// 0.36
echo bcdiv(1.1, 3);

// 1.10
echo bcmod(1.1, 2.2);

// 2.44
echo bcmul(1.11, 2.2);

// 1.05
echo bcsqrt(1.11, 2.2);

发表评论

暂无评论,抢个沙发...

客服 工单