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";
}

最新文章

  1. Linux之sar命令介绍
  2. 在Windows环境中开始Docker的学习和体验
  3. vc编译 zlib 1.2.8
  4. OpenCV Linux 安装 Make出错
  5. RunLoop机制理解
  6. Asp.net mvc中的Ajax处理
  7. 手机NFC模拟门禁卡
  8. 解决tomcat debug 调试时间过长的问题
  9. Oracle database
  10. 朱晔和你聊Spring系列S1E10:强大且复杂的Spring Security(含OAuth2三角色+三模式完整例子)
  11. 解决mapper绑定异常:nested exception is org.apache.ibatis.binding.BindingException:
  12. 分布式计算(二)使用Sqoop实现MySQL与HDFS数据迁移
  13. Java Configuration Manager Automatic Reloading
  14. JavaScript之图片操作7
  15. 个人理解的Windows漏洞利用技术发展史
  16. linux tar gzip 命令用法
  17. 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录
  18. 【总结】IE和Firefox的Javascript兼容性总结
  19. 蓝桥杯 第三届C/C++预赛真题(5) 转方阵(C基本功)
  20. Eclipse Android 代码自己主动提示功能

热门文章

  1. 10款精美的web前端源码的特效
  2. 济南学习 Day 4 T1 pm
  3. NSS_10 EXTJS给弹出的子窗口传递参数
  4. winform INI文件操作辅助类
  5. php读取html并截取字符串
  6. Linux下iptables拦截Nginx的问题
  7. Zend-MVC intro
  8. 【转】char*,const char*和string的相互转换
  9. Eclipse 常用插件
  10. How To Fix – Mcrypt PHP extension required in Laravel on Mac OS X (No MAMP)