PHP 浮点型比较的小坑

PHP中浮点型数据的精度问题可能导致比较错误,例如1200.85*100与120085不相等。由于浮点数计算存在精度损失,直接比较可能导致误判。解决方法包括使用bc函数的bccomp,或者在明确小数位数时进行取整比较。此外,转换为字符串进行比较也是一种临时解决方案。官方手册对此有详细警告,建议开发者注意此陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PHP浮点型比较的坑

php浮点型比较的坑,理论上浮点型的数据都是有精度损失的,不能直接比较大小,但是有时候需要比较浮点数是否相等,这里会有坑,跟我们想的都不太一样

<?php
    die(var_dump(1200.85 * 100 === 120085));

上面的结果看表面意思是true,但是实际运行确实false

php浮点数值并不能比较大小 因为php采用的是双精度计数 取整比较会导致精度丢失 连个类型都是不一样的 一个是float 一个是int 比较大小肯定是有误差的

解决方法 可以使用bc函数bccomp 或者有明确小数位的时候可以取整比较round 或者使用gmp函数gmp_cmp 但是gmp函数和bc函数都需要在编译php时安装对应的扩展 线上操作就不太方便了

还有一种临时解决方法 将要比较的两个数全部强制转为字符串 然后通过字符串比较相等的方式来判断 具体操作如下:strval(1200.85 * 100)

具体的可以参考下php官方手册,靠上方位置有一段大红的警告 有对应的说明

官方参考: https://www.php.net/manual/zh/language.types.float.php

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值