在上一篇文章中已经了解了浮点数在计算机中的存储原理,同时也介绍对浮点数取整和取余的函数.在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函数里面的放大缩小倍数就可以了。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://hxydj.blog.csdn.net/article/details/122975559
内容来源于网络,如有侵权,请联系作者删除!