C语言学习笔记---浮点函数floor()和ceil()和浮点数四舍五入

x33g5p2x  于2022-02-17 转载在 其他  
字(2.5k)|赞(0)|评价(0)|浏览(260)

在上一篇文章中已经了解了浮点数在计算机中的存储原理,同时也介绍对浮点数取整和取余的函数.在C语言标准库里面还提供了对于浮点数取整的两个函数。函数原型如下:

double __cdecl ceil(double _X);
  double __cdecl floor(double _X);

ceil函数返回大于或等于 x 的最小的整数值。下面通过一个简单的例子,演示一下ceil函数的用法。

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

int main ()
{
   float val1, val2, val3, val4;

   val1 = 1.0;
   val2 = 1.8;
   val3 = 2.1;
   val4 = 2.5;

   printf ("value1 = %.1lf\n", ceil(val1));
   printf ("value2 = %.1lf\n", ceil(val2));
   printf ("value3 = %.1lf\n", ceil(val3));
   printf ("value4 = %.1lf\n", ceil(val4));
   
	return(0);
}

分别定义了4个浮点数,然后使用ceil函数取最小整数。输出结果如下:

通过输出的结果可以看到,只有当小数部分为0的时候,返回的值才和整数部分相等,其他情况下,返回的值都比整数部分大。

接下来在看floor函数,floor函数返回小于或等于 x 的最大的整数值。使用上面的例子来测试floor函数。

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

int main ()
{
   float val1, val2, val3, val4;

   val1 = 1.0;
   val2 = 1.8;
   val3 = 2.1;
   val4 = 2.5;

   printf ("value1 = %.1lf\n", floor(val1));
   printf ("value2 = %.1lf\n", floor(val2));
   printf ("value3 = %.1lf\n", floor(val3));
   printf ("value4 = %.1lf\n", floor(val4));
   
   return(0);
}

程序执行结果如下:

通过结果可以看出,函数返回的值都是和浮点数整数相等的值。

看到上面两个函数都是对浮点数取整的,但是有时候是等于整数部分,有时候是大于整数部分的,那么C库函数中是不是还有对浮点数四舍五入的函数呢?遗憾的是并没有。如果要对浮点数进行四舍五入的操作,就必须我们自己实现。

首先通过一个简单的例子来看一下系统是如何处理四舍五入的情况。

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

int main ()
{
	float val1, val2, val3, val4;
	int val;

	val1 = 1.055;
	val2 = 1.855;
	val3 = 2.155;
	val4 = 2.555;

	printf ("value1 = %.2f\n", val1);
	printf ("value1 = %.2f\n", val2);
	printf ("value1 = %.2f\n", val3);
	printf ("value1 = %.2f\n", val4);
	
	return(0);
}

定义了四个浮点数,小数位数都是3位,但是打印的时候只打印两位小数,这样就可以看到系统如何处理这种情况。输出结果如下:

通过结果可以看到,有的数据加1了,有的又没有加1,说明系统对于这种情况的处理是随机的。不知道它什么时候会加,什么时候不加。那么为了有效的进行四舍五入,这里就需要自己来实现。

由于编译器对小数位的处理是不确定的,那么为了准确的计算,就需要先将浮点数转换为整数,然后给转换后的整数加上5,然后再将这个整数转换为小数。这样当最后一位数字小于5时,加上5之后不会给前一位进1,在转换成小数后不影响,如果最后一位数大于等于5,当加上5之后,就会向前面进1,这样转换为小数后,最后一位数字就会大一,这样就间接的完成了四舍五入。

比如1.245要取两位小数,首先将它扩大1000倍,变为整数1245,然后在加上5,他就变成了1250,这时候再将它缩小10倍,去掉最后一位数,变成125,最后将它在缩小100倍,变成浮点数1.25,此时就完成了四舍五入,同时也不会损失精度。

下面就单独编写一个函数来实现这个过程。

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

float round_off(float a)
{
	float b;
	int t = (a * 1000 + 5) / 10;     
	b = (float)t / 100;            
}

int main ()
{
	float val1, val2, val3, val4;
	float val;

	val1 = 1.055;
	val2 = 1.854;
	val3 = 2.155;
	val4 = 2.554;

	val =round_off(val1);
	printf ("value1 = %.2f\n", val);

	val =round_off(val2);
	printf ("value2 = %.2f\n", val);

	val =round_off(val3);
	printf ("value3 = %.2f\n", val);

	val =round_off(val4);
	printf ("value4 = %.2f\n", val);

	return(0);
}
}

自定义函数round_off用来实现四舍五入的过程,将浮点数参数函数后,取两位小数进行四舍五入,然后将四舍五入之后的浮点数返回。程序运行结果如下:

通过输出结果可以看出,对四个浮点数取两位小数,并进行四舍五入的结果是正确的。如果要取一位或者三位小数的话,只需要修改round_off函数里面的放大缩小倍数就可以了。

相关文章