三途河畔

聊一聊关于PHP浮点运算的问题

默认分类

问:PHP代码var_dump(intval(0.57*100));输出结果是int(56)而非int(57),请简述原因及如果避免。

浮点运算这个问题不论是前端JS还是后端是经常会遇到的,但是直接进行计算的话浮点的精确度有可能出现与预期不符的情况。

原因:

十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式,所以就会造成混乱的结果。不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333......

解决方法:

1.如果0.57与100都确认的情况下,可以使用如下写法:intval(0.57*1000)/10,结果输出为int(57);

2.使用strval()方法替换intval()方法,结果输出string(57);

3.使用bcmatch扩展进行精确运算,bcmul()方法将两个高精度数字相乘,bcmul(0.57,100),结果输出string(57)

如何避免:

1.业务货币使用“分”为最小单位,假设用户支付1元,后端实际操作为1*10,则可以避免此类问题。(缺点就是会出现超大整形数,显示为科学计数法时不方便操作)

2.在不确定具体数额并且可能会存在小数的业务场景里,前后端都需要进行精确计算,无论是整型或浮点。

点我评论
打赏本文
二维码


18

文章

1

标签

 文章分类

 友情链接