PHP 浮点型比较的小坑

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

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

在C++中,比较浮点型变量和整数大小可以直接使用比较运算符(如`<`、`>`、`<=`、`>=`、`==`、`!=`),因为C++会自动进行类型转换。以下是示例代码: ```cpp #include <iostream> int main() { double num = 3.14; int integer = 3; if (num > integer) { std::cout << "浮点型变量大于整数" << std::endl; } else if (num < integer) { std::cout << "浮点型变量小于整数" << std::endl; } else { std::cout << "浮点型变量等于整数" << std::endl; } return 0; } ``` 在上述代码中,直接使用`>`、`<`和`==`比较运算符对浮点型变量`num`和整数`integer`进行大小比较,如果浮点型变量大于整数,输出“浮点型变量大于整数”;如果浮点型变量小于整数,输出“浮点型变量小于整数”;如果浮点型变量等于整数,输出“浮点型变量等于整数”。 需要注意的是,由于浮点数在计算机中是以二进制近似表示的,可能会存在精度误差。因此,在比较浮点数是否相等时,建议直接使用`==`运算符,而是应该判断它们的差值是否在一个很小的范围内,例如: ```cpp #include <iostream> #include <cmath> int main() { double num = 3.000000000000001; int integer = 3; const double epsilon = 1e-9; if (std::abs(num - integer) < epsilon) { std::cout << "浮点型变量和整数近似相等" << std::endl; } else if (num > integer) { std::cout << "浮点型变量大于整数" << std::endl; } else { std::cout << "浮点型变量小于整数" << std::endl; } return 0; } ``` 在上述代码中,定义了一个很小的常量`epsilon`,用于表示允许的误差范围。使用`std::abs()`函数计算浮点型变量和整数的差值的绝对值,如果差值小于`epsilon`,则认为它们近似相等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值