当前位置:首页 > 叨叨念念 > PHP浮点数计算

PHP浮点数计算

叨叨念念 / 星之宇 / 2021-11-23 16:24 / 浏览:246 / 评论:0

1、浮点数坑

PHP在使用加减乘除等运算符计算浮点数的时候,经常会出现意想不到的结果,特别是关于财务数据方面的计算,会造成Bug。这是所有语言基本上都会遇到的问题,所以基本上大部分语言都提供了精准计算的类库或函数库。

$a = 1000;
$b = 999.99;
var_dump($a-$b); //float(0.0099999999999909)

你认为/期望的输出是float(0.01),实际是float(0.0099999999999909)。


2、解决方法一

1位小数*10,2位小数*100,3位小数*1000,……n位小数*n,做完加减乘除法后,再除以倍数。(著名ERP系统SAP也是使用类似的方法处理的)

$a = 1000;
$b = 999.99;
var_dump(($a*100-$b*100)/100); //float(0.01)


3、解决方法二

使用PHP提供的高精度函数计算。

$a = 1000;
$b = 999.99;
var_dump(bcsub($a,$b,2)); //string(4)"0.01"

高精度函数库:

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

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

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

bcmod — 求高精度数字余数

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

bcpow — 求高精度数字乘方

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

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

bcsqrt — 求高精度数字平方根

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

目前有 0 条评论

    • 昵称
    • 邮箱
    • 网址