c 四舍五入(C 四舍五入的4种方法 C 四舍五入的4种方法)
一、c语言中有没有进行四舍五入的函数
首先,这个问题的解决方案取决于我们所需要的转换方式:是截断转换还是舍入转换;另一方面,它基本与我们需要转换的浮点数类型无关──无论是 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类型。
二、c语言四舍五入的代码怎么打
要用C语言实现四舍五入,有一个很巧妙的方法,仅使用int i=(int)(a+0.5)即可。如果遇到有负数的情况,只需要将加号改为减号即可。
C语言中四舍五入这样表示:
inta=100.453627。
printf("%.1f",a+0.05);//四舍五入到十分位。
printf("%.2f",a+0.005);//四舍五入到百分位。
以此类推,对于十进制小数.5类型数(如0.5,11.5,18.5),即小数部分可以以2的负一次方来表示的数,这时计算机是可以“完美”的储存这个十进制小数字。而对于.6,.7,.8,.9与.4,.3,.1,.2,这类数字,计算机虽然无法“完美”的储存这些数字,在这样的情况下可以运用所谓的“+0.5的取整法”。
所谓加0.5的取整法就是运用在C语言中浮点型数强制转化为整形数时只会其保留整数,而不会进行四舍五入的计数法则。所以对于保留整数的小数来说,我们只需在其原来的基础上+0.5后再进行强制类型转换,就可以达到不会出错的四舍五入。
有的标准不存在C语言四舍五入:
C语言中的四舍五入在C98标准中,标准C函数库是没有关于四舍五入的函数的,到了C99标准才出现了ceil(),floor(),nearbyint(),round()之类丰富的取整函数。
现在使用的gcc都是C99标准了,而Windows下的VC(包括VS2008)还是C98标准,所以需要遵从严格格式,包括没有内联inline、没有单行注释//、变量要写在代码块的前头等等,最大的缺点就是没有那些函数的支持。
三、c语言如何四舍五入 跟 进一法除法 的 算法
你的思路有问题
不是一步搞定的
首先,c用的是去尾法
所以四舍五入就要加5给要去的第一位
进一法就要加一给保留的最后一位(注意相等问题)
ok代码大概是这样,以整数位为例
int a,b;
double x,y,z;
输入y z。。。。。
x=1.0*y/z
//四舍五入
a=x+0.5;//好久没用c忘了要不要强制转换了反正思路就是这样
//进一
b=x;
if(b==x)看保留精度后是否和原数相等
{
//什么都不干
}
else
{
b=b+1;//不相等就最低位加一
}