Relearning PHP (2) – php 的浮点数float
2024-10-09 03:40:26
Relearning PHP (2) – php 的浮点数float
php有很多坑,但是并不妨碍他是最好的语言。其他语言对于浮点数处理同样有问题,这应该是个“共有坑”。不信可以用google搜索“java float 坑”或者“C++ float 坑”试试。做电商的同学,涉及到钱的方面,用到浮点数是难免的,可能会遇到类似的问题。这个坑是这样的
<?php $a = 146.40;
$b = 48.80; if ($a == ($b * )) {
echo "true";
} else {
echo "false";
}
计算器计算 48.8 * 3 = 146.4,但是结果当然是false了。原因就是这个坑。官方文档的描述如下:
浮点数的精度
浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。
此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118…。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。
关于浮点数比较可以有几个办法如下:
<?php
$a = 146.40;
$b = 48.80; // 取适当精度
if (round($a, ) == round($b*, )) {
echo "true";
} else {
echo "false";
} // 相减的差值非常小
$epsilon = 0.000001;
if (abs($a-$b*) < $epsilon ) {
echo "true";
} else {
echo "false";
}
最新文章
- Linux之sar命令介绍
- 在Windows环境中开始Docker的学习和体验
- vc编译 zlib 1.2.8
- OpenCV Linux 安装 Make出错
- RunLoop机制理解
- Asp.net mvc中的Ajax处理
- 手机NFC模拟门禁卡
- 解决tomcat debug 调试时间过长的问题
- Oracle database
- 朱晔和你聊Spring系列S1E10:强大且复杂的Spring Security(含OAuth2三角色+三模式完整例子)
- 解决mapper绑定异常:nested exception is org.apache.ibatis.binding.BindingException:
- 分布式计算(二)使用Sqoop实现MySQL与HDFS数据迁移
- Java Configuration Manager Automatic Reloading
- JavaScript之图片操作7
- 个人理解的Windows漏洞利用技术发展史
- linux tar gzip 命令用法
- 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录
- 【总结】IE和Firefox的Javascript兼容性总结
- 蓝桥杯 第三届C/C++预赛真题(5) 转方阵(C基本功)
- Eclipse Android 代码自己主动提示功能