C语言学习|判断语句中的浮点数比较问题

Posted 智造之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言学习|判断语句中的浮点数比较问题相关的知识,希望对你有一定的参考价值。

浮点数在计算机中是如何存储的?

有一个浮点型变量i,如何判断i的值是否是2.3?

float a = 2.3;
if (a == 2.3) {
  printf("a = 2.3\n");
}
else {
  printf("a!=2.3\n");
}

输出:

a!=2.3 // 输出结果,不等于2.3。

实数5.4在计算机中存储的是5.40000009536743160000,比5.4稍大那么一点点;而实数2.3在计算机中存储的是2.29999995231628420000,比2.3稍小那么一点点。这个没有规律可言,总之是一个近似值。

在通常情况下,浮点型数据只能存储近似值。因此以后在写程序的时候,在if语句中千万不要用浮点数进行比较,不然结果往往都是错的。

#include <stdio.h>
#include <math.h>

int main(void)
{
 float a = 2.3;
 if (fabs(a - 2.3) < 0.000001) {
  printf("a = 2.3\n");
 }
 else {
  printf("a!=2.3\n");
 }
 
  return 0
}

输出:

a = 2.3

其中fabs()是C语言中的库函数,直接调用就可以了,它表示求浮点数的绝对值。其中f是float的缩写,abs是absolute的缩写,即“绝对”的意思。如果是求整数的绝对值就用abs()。但是这两个库函数是包含在math.h中的,所以前面一定要先写上# include<math.h>

貌似:float的精度为6~7位有效数字,double的精度为15~16位有效数字。


笔记来自《手把手教你学C语言》[1]

参考资料

[1]

吴明杰: 《手把手教你学C语言》


以上是关于C语言学习|判断语句中的浮点数比较问题的主要内容,如果未能解决你的问题,请参考以下文章

Lua和C++中的浮点数的比较

与霓虹内在函数中的浮点数比较

Printf 用于 c 中的浮点数

如何从 C 中的浮点数中提取有偏指数?

比较 Unity 中的浮点数

将结构与 rust 中的浮点数进行比较