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

float 型: 占 4 字节,7 位有效数字

double 型:占 8 字节,15~16 位有效数字

浮点数的表示是不精确的,float 和 double 都不能保证可以把所有实数都准确的保存在计算机中。测试例子如下:

#include <stdio.h>

int main(int argc, char *argv[])
{
	float f = 99.9f;
	printf("f = %f\n", f);

	return 0;
}

运行结果如下:

由于浮点数的表示是不精确的,所以不能直接比较两个数是否完全相等。一般都是在允许的某个范围内认为某个个浮点数相等,如有两个浮点数a、b,允许的误差范围为 1e-6,则 abs(a-b) <= 1e-6,即可认为 a 和 b 相等。

#include <stdio.h>
#include <stdlib.h> //abs()

int main(int argc, char *argv[])
{
	float a = 10.55f;
	float b = 10.55f;

	if( abs(a-b) <= 1e-6 ){
		printf("a 等于 b\n");
	}else{
		printf("a 不等于 b\n");
	}

	return 0;
}

还有一种方法就是扩大再取整,比如 a=5.23、b=5.23,直接比较 a==b 有可能为 false,但是 a 和 b 都扩大一百倍,然后强制转换为 int 类型,再用 == 比较就可以了。

#include <stdio.h>

int main(int argc, char *argv[])
{
	float a = 5.23;
	float b = 5.23;

	if( (int)(a*100) == (int)(b*100) ){
		printf("a 等于 b\n");
	}else{
		printf("a 不等于 b\n");
	}

	return 0;
}

float 型变量和“零值”比较的方法:

#include <stdio.h>

int main(int argc, char *argv[])
{
	float x = 0.000f;
	const float EPSINON = 0.000001;
	if (( x >= -EPSINON ) && ( x <= EPSINON ))
	{
		printf("x 是零\n");
	}

	return 0;
}

浮点型变量并不精确,其中 EPSINON 是允许的误差(即精度),所以尽量不要将 float 变量用 “==” 或 “!=” 与数字比较,应该设法转化成 “>=” 或 “<=” 形式。

参考资料:http://blog.csdn.net/ljx0305

版权声明:本博客文章,大多是本人整理编写,或在网络中收集,转载请注明出处!!

时间: 2024-12-17 01:07:12

判断两个( float )变量是否相等以及和 0 值比较方法的相关文章

编写一个diff工具,用于判断两个目录下所有的改动--3.0版本

没心情优化代码了,就先这样吧 1 package comcollection.test; 2 3 import java.io.BufferedInputStream; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java

已知两个int变量a、b,定义4个方法分别对变量a、b进行加减乘除运算,并测试结果。

package com.fs.test; public class Test { public void aMethod(int a, int b) { int add = a + b;//*表示加法运算 int reduce = a - b;//*表示减法运算 int multiply = a * b;//*表示乘法运算 int divide = a/b;// a对b整除的数 /表示除法,b不能为0 System.out.println("add = " + add); System

C语言——结构体数组的使用案例(如何判断两个矩形是否相交,其中一个是否包含在另外一个里面,点是否在矩形中)

Rect.h struct CPoint { float x; float y; }; typedef struct CPoint CPoint; struct CSize { float width; float height; }; typedef struct CSize CSize; struct CRect { CPoint origin; CSize size; }; typedef struct CRect CRect; //判断两个矩形是否相交 BOOL isIntersecti

请编写一个程序,该程序可以接收两个数,并判断两个数是大于、小于、等于?

//作者:janushu //日期:2017/9/20 //功能判断两个数的大小 import java.io.*; public class CompareToNumDemo{ public static void main(String[] args){ try{ //输入流 从键盘上输入一个数 InputStreamReader isr = new InputStreamReader(System.in); //缓存读取一个数 BufferedReader br = new Buffere

不能用==判断两个浮点数相等

在判断两个浮点数 a 和 b 是否相等时,不要用 a==b,应该判断二者之差的绝对值fabs(a-b) 是否小于某个阈值,例如 1e-9. ////在判断两个浮点数 a 和 b 是否相等时,不要用 a==b,应该判断二者之差的绝对值 ////fabs(a - b) 是否小于某个阈值,例如 1e-9. //#include <stdio.h> //#include <math.h> //#define EPSILON 0.000001 //int main() //{ // floa

POJ1269:Intersecting Lines(判断两条直线的关系)

题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点了. #include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <math.h> #include <queue> #

if 判断两个数值大小--多分支if语句实现对参数的严格判断

if 判断两个数值大小--多分支if语句实现对参数的严格判断 #!/bin/bash print_usage(){ printf"你输入的参数个数不对或者有误,请按照下面语法执行:\n" echo -e "$0 数字1 数字2" exit1 } if[ $# -ne 2   ] then print_usage exit1 fi [  -n "`echo $1|sed 's/[0-9]//g'`" -a-n "`echo $2|sed

You can Solve a Geometry Problem too (hdu1086)几何,判断两线段相交

You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6837 Accepted Submission(s): 3303 Problem Description Many geometry(几何)problems were designed in the ACM/ICPC. A

Java判断两个对象是否相等的规则

Object类中的equals方法用于检测一个对象是否等于另外一个对象.在Object类中,这个方法将判断两个对象是否具有相同的引用.如果两个对象具有相同的引用,它们一定是相等的.从这点上看,将其作为默认操作也是合情合理的.然而对于多数类来说,这种判断并没有什么意义.例如,采用这种方式比较两个PrintStream对象是否相等就完全没有意义.然而,经常需要检测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的. 例如,如果两个雇员对象的姓名.薪水和雇佣日期都一样,就认为它们是