转自:http://blog.csdn.net/mydriverc2/article/details/49888947

float 类型不能比较相等或不等,但可以比较>,<,>=,<=

用==从语法上说没错,但是本来应该相等的两个浮点数由于计算机内部表示的原因可能略有微小的误差,这时用==就会认为它们不等。应该使用两个浮点数之间的差异的绝对值小于某个可以接受的值来判断判断它们是否相等,比如用

if (fabs(price - p) < 0.000001)

来代替

if (price == p)

很多工程的应用都是采用计算精确度的方式

定义一个精度,用差的绝对值比较,在精度范围内就认为是相等的;大小可以直接比较。

【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float 还是double 类型的变量,都有精度限制。所以一定要
避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON 是允许的误差(即精度)。

计算机表示浮点数(float或double类型)都有一个精度限制,对于超出了精度限制的浮点数,计算机会把它们的精度之外的小数部分截断。因此,本来不相等的两个浮点数在计算机中可能就变成相等的了。例如:

    float a=10.222222225,b=10.222222229
    数学上a和b是不相等的,但在32位计算机中它们是相等的。
 
    如果两个同符号浮点数之差的绝对值小于或等于某一个可接受的误差(即精度),就认为它们是相等的。
    不要直接用“==”或者“!=”对两个浮点数进行比较,但是可以直接用“<”和“>”比较谁大谁小。
test.cpp
****************************************
#include
#include
#define EPSILON 1e-6
int main(void)
{
  float a = 0.000003;
  float b = 0.000005;
  printf("a=%f/n",a);
  printf("b=%f/n",b);
  printf("abs(a-b)=%f/n",abs(a-b));
  printf("fabs(a-b)=%f/n",fabs(a-b));
  if ( fabs(a-b) <= EPSILON )  //判断浮点数是否相等
  {
 printf("a==b/n");
  }else
  {
 printf("a!=b/n");
  }
  if ( fabs(a) <= EPSILON)  //判断浮点数是否等于0
  {
 printf("a==0/n");
  }else
  {
 printf("a!=0/n");
  }
  if (a > b)  //比较两个浮点数的大小,
  {
 printf("a>b/n");
  }else
  {
 printf("a
  }
  return 0;
}

最新文章

  1. 聊一聊jquery文件上传(支持多文件上传)
  2. 包管理器Bower
  3. 使用 AngularJS 开发一个大规模的单页应用(SPA)
  4. 应用PHPCMS V9轻松完成WAP手机网站搭建全教程
  5. BZOJ 3260 跳
  6. 集成友盟分享SDK报错
  7. 微软职位内部推荐-Senior SDE
  8. Hibernate之QBC查询与本地SQL查询
  9. js跨浏览器事件对象、事件处理程序
  10. CodeFirst EF中导航属性的个人理解
  11. 七 APPIUM Android 定位方式
  12. 从equals和==的区别开始
  13. 小程序radio样式修改
  14. Mathematica绘制曲面交线方法(方法二)
  15. MySQL设置全局sql日志
  16. 解题:NOI 2012 骑行川藏
  17. 程序启动-Runloop
  18. MP 及OMP算法解析
  19. python爬取商品信息
  20. 【mysql 优化 1】优化概述

热门文章

  1. 20155331 丹增旦达 2006-2007-2 《Java程序设计》第二周学习总结
  2. 20145226夏艺华 Exp6 信息搜集与漏洞扫描
  3. [arc082F]Sandglass
  4. nowcoder wannafly 25 E:01串
  5. 强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods)
  6. java list根据id获取子节点
  7. Unity标准材质官方教程合集
  8. 3星|《科技投资新时代》:TMT行业资讯汇编
  9. JUnit initializationError错误
  10. .NET导出Excel之NPOI