默认分类

PHP中的浮点型数据计算之程序员脱发问题

先来问大家一个问题吧?带个迷之微笑的表情
1.2减1.2等于几?
我知道很多人一口就会说出答案,但是你先别着急说出来,往下看。

周六上班状态真的很差,一大早的坐地铁做过了站,出地铁站又走错了出口,更衰的是昨天写好的接口,一大早就出现了很让人难带晕的事情,当时我简直不敢相信自己的眼睛。

55e817b46205cd0c9c30c7f8d939aee.png

大家想的结果肯定跟我想的结果是一样的,可是,偏偏老天总是喜欢调戏你们这些不动脑子的
哈哈哈,他输出的结果竟然是2.2204~,我的天哪?竟然还越减越多了?又一次刷新了我小学毕业的三观啊!

ee709cb275925407163b3ba59792a0f.png

其实在计算机浮点数计算的时候往往会出现很多我们意料之外的结果。如果涉及到精确的数据计算,如业务数据计算,财务数据计算的时候,为了保持数据的精准度和正确性,我们可以采取以下方法解决:
第一种也是最简单的方法:

    通过乘100的方式转化为整数加减,然后在除以100转化回来……

第一种:使用number_format转化成字符串,然后在使用(float)强转回来……
第三种:php提供了高精度计算的函数库,实际上就是为了解决这个浮点数计算问题而生的。(但是对于记忆力不是很好的同学,看到这些函数是不是很头疼)

主要函数有:
bcadd — 将两个高精度数字相加
bccomp — 比较两个高精度数字,返回-1, 0, 1
bcdiv — 将两个高精度数字相除
bcmod — 求高精度数字余数
bcmul — 将两个高精度数字相乘
bcpow — 求高精度数字乘方
bcpowmod — 求高精度数字乘方求模,数论里非常常用
bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
bcsqrt — 求高精度数字平方根
bcsub — 将两个高精度数字相减

说完了解决方案,我才用的方法是第一种:
通过乘100的方式转化为整数加减,然后在除以100转化回来

    //余额
    $balance = intval($total*100) - intval($arrivalTotal*100);
    //已提现
    $data['balance'] = $balance/100;

结果:

{
"code": "200",
"msg": "用户获取的返佣统计",
"data": {
    "total": 1.2,
    "balance": 0,
    "arrival_account": 1.2
}

}

最近头发掉的超级严重,谁有没有什么好的洗发水推荐的?

祝愿大家在程序员的道路上永远不掉头发!

微信扫一扫,向我赞赏

微信扫一扫,向我赞赏

微信扫一扫,向我赞赏

支付宝扫一扫,向我赞赏

回复

This is just a placeholder img.