c语言中有没有进行四舍五入的函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中有没有进行四舍五入的函数相关的知识,希望对你有一定的参考价值。
比如floor(2.5) = 2是向下取整,ceil(2.5) = 3是向上取整这种类似的四舍五入的函数?
首先,这个问题的解决方案取决于我们所需要的转换方式:是截断转换还是舍入转换;另一方面,它基本与我们需要转换的浮点数类型无关──无论是 float 还是 double,甚至是 long double。有时人们觉得一个浮点变量的值和一个整型变量的值可以完全一样地可表示,你可能相信 x 值为 100.0 时我们只要把它转换为整型就会得到整数 100。但在任何时候,你都不应依赖于期望一个浮点数的值能够与一个整型数的值完全相等,你真正所需要的可能是四舍五入。
截断转换的意思是抛弃所有的小数部分,例如 3.9 将被转换为 3,这种转换是 C 语言中将浮点数转换为整型数的默认方式,也就是说无论在什么时候,只要将浮点数转换为整型数,采用的都是这种方式。关于这种转换何时发生,有一些特殊的规定,这里我们仅指出赋值时所发生的转换,比如
i = x;
其中 i 是一个整型数,x 是一个浮点数。当然,在显式类型转换的情况下,这样的转换也会发生,比如
(int) x
舍入转换是指获取与给定浮点数最为接近的整型数,因此 3.9 应被转换为 4,这才是人们提出我们正在解决的这个问题时所真正需要的。对于舍入转换,我们没有直接的工具(比如运算符或者库函数),严格地说,舍入转换并非与 C 标准里所定义的转换在同一意义下的转换。
对于正的浮点数,最简单的四舍五入方法就是用这样的一个表达式
(long) (x+0.5)
但是如果表达式对负数有效的话会更好,即使在你看来负数的情况不会发生。这意味着你可以用一个条件表达式:
x >= 0 ? (long)(x+0.5) : (long)(x-0.5)
这个表达式的返回值就是与浮点变量 x 的值最接近的整数值。
如果需要大量地使用舍入转换,则可以写这样的一个宏:
#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
这可以在某种程度上使代码更具可读性。
注意到这样的转换会将 1.5 变为 2 但却将 -1.5 变为 -2,那么对于这样正好处于两个整数之间的浮点数,你可能需要做一些其它的处理,但这在实际当中并不十分重要。
需要小心的是,将一个浮点数转换为一个整型数可能导致上溢,但大多数的实现都没有进行相关的判断。用 long 替代 int 会给出一个更宽的范围(建议使用 long),但仍然比浮点数的范围要小得多。
如果效率不是至关重要的话,则可以定义这样的一个函数(而不是简单地写一个 #define),使你的程序更具鲁棒性:
long round(double x)
assert(x >= LONG_MIN-0.5);
assert(x <= LONG_MAX+0.5);
if (x >= 0)
return (long) (x+0.5);
return (long) (x-0.5);
如果在意效率的话,可以写这样一个宏
#define round(x) ((x) < LONG_MIN-0.5 || (x) > LONG_MAX+0.5 ?\
error() : ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
这要求在程序中有 #include <limits.h>,并且有一个处理错误的函数 error,其返回值为 long 类型。 参考技术A X=(int)X是把小数直接去了
X=(int)(X)是四舍五入 参考技术B 标C没有相应函数,但可以间接实现
a=(int)(2.5);//a=floor(2.5)
a=(int)(2.5+0.5);//a=ceil(2.5) 加0.5相当于四舍五入 参考技术C 没见过,不过你可以自己用小技巧:比如要保留2位小数的float a 第三位四舍五入
则可以这样 a = (int)(a*100 + 0.5)/100本回答被提问者采纳 参考技术D round(x)
参数时double型,返回小数对整数部分的四舍五入值
比如 round(3.623); 返回4
C++的四舍五入函数
本文由Markdown语法编辑器编辑而成。
C++的四舍五入函数比较:
对含有小数点的数进行四舍五入是比较普遍的一种需求。在C++中也有类似的取整函数。在C++的头文件中有floor()和ceil()函数。在STL中还有round()函数。这三个函数的作用如下:
函数名称 | 函数说明 | 2.1 | 2.9 | -2.1 | -2.9 |
Floor() | 不大于自变量的最大整数 | 2 | 2 | -3 | -3 |
Ceil() | 不小于自变量的最大整数 | 3 | 3 | -2 | -2 |
Round() | 四舍五入到最邻近的整数 | 2 | 3 | -2 | -3 |
从函数说明中可以看出,
(1) Floor()会取不大于自变量的最大整数,这样自变量是3.1或3.9是没有区别的,返回都是3;自变量是-2.1或-2.9也是没有区别的,返回都是-3;
(2) Ceil()会取不小于自变量的最大整数,这样自变量是3.1或3.9,返回都是4;自变量是-2.1或-2.9,返回的都是-2;
(3) Round()函数,才是我们需要的四舍五入的函数,因为它会返回离自变量最近的整数,这个返回的整数可能大于也可能小于原来的数,但是一定是离它最近的那个整数。
注:floor(), ceil()函数都包含在头文件“Math.h”中,但是round()函数未包含在该头文件中。因此可以通过以上的原理,来自己实现round()函数,实现含有小数的数字的四舍五入。
代码实现一:
int round_double(double number)
return (number > 0.0) ? (number + 0.5) : (number - 0.5);
代码实现二:
int round_double(double number)
return (number > 0.0) ? floor(number + 0.5) : ceil(number - 0.5);
参考链接:
关于四舍五入的相关链接如下:
http://stackoverflow.com/questions/485525/round-for-float-in-c
http://blog.csdn.net/hankai1024/article/details/7887415
以上是关于c语言中有没有进行四舍五入的函数的主要内容,如果未能解决你的问题,请参考以下文章
C语言有没有数据的四舍五入?啥情况下会用到四舍五入?数据类型转换?