两个float 怎么比较大小

转载 2015年11月17日 16:13:03

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



两个float值比较大小

如果程序中要求比较两个float值是否相等,你会怎样写呢? float a; float b; if(a == b) { ... ...
  • liyun123gx
  • liyun123gx
  • 2014年02月12日 17:48
  • 2920

计算机中基本类型float值表示和大小比较问题

通常计算机编程语言中都建议不要比较基本类型float的大小,特别是不要用等号来比较。(BigDecimal等对象类型例外,因为它已经不是采用IEEE 754标准表示法) 举例说明:  ...
  • pizi0475
  • pizi0475
  • 2015年01月15日 10:55
  • 1557

俩个float数之间比较大小

需求:俩个标识金额的浮点数比较大小。 问题:相等无法成立。经过var_dump()打印,俩个浮点数数值 一样大。 解决:把标识金额的浮点数乘以100,抓换成整形,在做比较。即可使相等成立...
  • u013450576
  • u013450576
  • 2016年03月31日 15:50
  • 143

Java中Integer/Long/Double/Float大小比较

在开发的过程中,在jdk1.5后可以直接用==来做比较,后来发现不是这个样子的哈哈~ 先看一段代码与运行结束: public static void main(String[] args) {...
  • bj_ameng
  • bj_ameng
  • 2016年12月08日 14:33
  • 1756

float 类型精度和两数比较大小

Windows VS2008 下,float型精度是7位小数. 在精度范围内,可以直接用 , == 逻辑判断两个float类型数据的大小. 在精度范围之外,多余数位将被忽略,从而分不同情况 : 以下是...
  • Howard_Liu1314
  • Howard_Liu1314
  • 2013年03月14日 20:34
  • 1515

永远不要比较两个浮点数是否相等

PHP手册里有一句话:永远不要比较两个浮点数是否相等。 以前没太在意,最近在项目中因为这个问题掉坑里了,所以留文铭记。 计算机内部处理浮点数的方式决定了浮点数不可能100%的精确,所以在处理浮点数...
  • tony_Ju
  • tony_Ju
  • 2012年02月08日 11:15
  • 2163

C语言中比较两个浮点数是否相等的方法,fabs和abs

今天在面试中碰到这个问题,当时还迷糊了一番,毕竟平时没怎么用过,记得以前看过,现在有点记不清了!这是C语言很基础的东西,面试一般会遇到! 对两个浮点数判断大小和是否相等不能直接用==来判断,会出错!...
  • jk110333
  • jk110333
  • 2013年05月08日 22:09
  • 15316

c++如何判断两个浮点数相等或者大小问题

SAP的面试题之一: 如何判断两个浮点数的大小: 例1: a=1.000001 b=1.0两个数,一般情况下会认为两者相等。一般我们会认为写出代码: #include "stdafx.h" #i...
  • xiao_Mrs_li
  • xiao_Mrs_li
  • 2017年11月29日 18:47
  • 417

java float比较相等

public class Test{     public static void main(String[] args){         isEqualOfFloat(10.222222225...
  • u010343544
  • u010343544
  • 2016年07月20日 09:30
  • 3963

判断两个float变量是否相等以及和 0 值比较方法

float 型: 占 4 字节,7 位有效数字 double 型:占 8 字节,15~16 位有效数字 浮点数的表示是不精确的,float 和 double 都不能保证可以...
  • zy986718042
  • zy986718042
  • 2017年05月24日 22:03
  • 2286
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:两个float 怎么比较大小
举报原因:
原因补充:

(最多只允许输入30个字)