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

Relearning PHP (2) – php 的浮点数float的更多相关文章

  1. Java浮点数float,bigdecimal和double精确计算的精度误差问题总结

    (转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结 ...

  2. IEEE浮点数float、double的存储结构

    众所周知,C的float.VB的Single都是32位浮点数变量类型(也叫单精度浮点数),C的double和VB的Double则都是64位的浮点数变量类型(也叫双精度浮点数).有些编译器还支持更屌的l ...

  3. 危险的浮点数float

    今天写程序又以为我见鬼了!最后查出来发现原来又是浮点数搞的鬼! 情况大致是这样的,我想要测试向量运算的速度,所以要对一个浮点数向量进行求和运算,代码如下: int vect_size=10000000 ...

  4. delphi 浮点数float转换成十六进制字符串的方法(FloatToHex)

    重新书写了float型转为十六进制的delphi程序 Function FloatToHex(Value: single): string; var l, i: integer; HexText,te ...

  5. 浮点数float累加误差解决方式总结

    首先是float累加产生误差的原因,该部分转自:http://blog.csdn.net/zhrh0096/article/details/38589067 1.  浮点数IEEE 754表示方法 要 ...

  6. php浮点数(float)运算中转整形(int)问题

    今天工作中遇见了一个浮点数转整形的问题,特此记录一下,防止以后再次踩坑. 实例: $f = 0.58; var_dump(intval($f * 100.0)); 也许你认为他会输出58,但是实际上他 ...

  7. C中的Float分析

    C/C++中, 浮点数,float以及 double 在内存中是怎样存储的? 假如,我有32-bit 8bit 8bit 8bit 0 0 0 0 0 1 1 1 1 对于整形int,我们可以很快得出 ...

  8. java基本类型(数值范围):浮点的底层表示定义,float计算快一些

    Java八种基本类型: 六种数字类型(四个整数型,两个浮点型), 一种字符类型, 一种布尔型. 具体如下 1.整数:包括int,short,byte,long 2.浮点型:float,double 3 ...

  9. 【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片

    一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...

随机推荐

  1. JS学习第四课

    当我们删除某列表格,再添加新的一列时,它的序号该如何控制呢.这里id=oTab.tBodies[0].rows.length+1        otd.innerHTML=id++;   很关键哦. ...

  2. hdu 2501 Tiling_easy version 递推

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2501 题目分析:已知有2*1,2*2,两种型号的瓷砖,要求铺满2*n的格子有多少种方法.可以考虑最左边 ...

  3. C语言 电梯函数

    #include <stdio.h> #include <time.h> #include <stdlib.h> void test(){//汉字输出 printf ...

  4. 《DNS服务缓存的建立》RHEL6

    安装dns软件包: 启动dns服务器 配置本地服务器dns域名解析: 查看dns的服务的端口是否打开: 解析百度测试: 安装dns缓存包: 再次访问解析百度

  5. 使用MongoDB的开源项目

    根据谷歌的搜索结果筛选出来的. 统计应用 counlty https://count.ly/ mongopress 开源CMS系统 http://www.mongopress.org/ Rubedo ...

  6. 一款非常炫酷的jQuery动态随机背景滚动特效

    一款非常炫酷的jQuery动态随机背景滚动特效 图片背景会不停息的滚动,带有那种漂浮的视觉效果,小圈圈飘动. 更好的是还兼容IE6浏览器,大伙可以好好研究研究. 适用浏览器:IE6.IE7.IE8.3 ...

  7. Windows7鼠标右键里没有新建文本文件的选项,解决办法

    1.“开始”->“运行”,输入"regedit",打开注册表编辑器 2.展开HKEY_CLASSES_ROOT,找到.txt 3.选中.txt,查看右侧窗格的“默认值”是不是 ...

  8. python 字典内置方法get应用

    python字典内置方法get应用,如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 今天给大家分享的就是字典的get()方法. 这 ...

  9. Linux nmon 监控工具使用

    Linux 系统下监控指标及指标查看 一.工具介绍     Linux 系统下资源监控使用nmon 工具.它可以帮助在一个屏幕上显示所有重要的性能优化信息,并动态地对其进行更新且并不会消耗大量的CPU ...

  10. hadoop启动后jps 没有namenode

      hadoop集群启动后,jps 发现没有namenode. 网上查了下,这问题可能是由于两次或两次以上格式化NameNode造成的. 因为我的是刚刚新搭建的集群,里面没什么资料,所以我直接删除各个 ...