要用C语言实现四舍五入,有一个很巧妙的方法,仅使用int i=(int)(a+0.5)即可。如果遇到有负数的情况,只需要将加号改为减号即可。
成都创新互联公司是一家专注于成都网站制作、成都做网站与策划设计,科尔沁右翼中网站建设哪家好?成都创新互联公司做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:科尔沁右翼中等地区。科尔沁右翼中做网站价格咨询:18982081108
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、没有单行注释//、变量要写在代码块的前头等等,最大的缺点就是没有那些函数的支持。
方法一:
#includestdio.h
int main()
{
double d1,d2,d3;
d1=-3.1415926;
d2=(int)(d1*10+0.5)*0.1;
printf("d1=%f,保留一位小数的结果为:%.1f\n",d1,d2);
d3=(int)(d1*1000+0.5)*0.001;
printf("d1=%f,保留三位小数的结果为:%.3f",d1,d3);
总结四舍五入保留n为小数
(int)(x*10的n次方+0.5)*10的负n次方;
其次这个方法对负数无效;如果非要用可以先取正数部分算,最后加上负号
}
方法二:
使用round()函数。
#include"stdio.h"
#include"math.h"
void main()
{
float x;
scanf("%f",x);
int y = round(x);
printf("%d",y);
}
扩展资料:
C语言编写注意事项:
1、%运算符不能应用与float或double类型。
2、char类型转换为int型时, 无法判断它是signed还是unsigned.这样其结果有可能为负数, 因此转换时尽量指定signed和unsigned限制符。
3、++i与i++不同之处: ++i是先+1在使用, i++是先使用i在递加1。
4、三元运算符"?:" 第一个表达式的括号不是必须的,但是由于三元表达式的优先级非常低,我们还是将第一个表达式用()括起便于阅读和理解。
5、C语言中可以使用递归 (即函数调用自身函数), 其不节省储存器开销也不加快执行速度, 只是使程序紧凑便于理解。
四舍五入算法:如果要求精确到小数点后面的第n位,则需要对第n+1位进行运算。方法是将该小数乘以10的n+1次方后加5,然后除以10并强制转换变量类型为长整型,再将该数除以10的n次方,同时强制转换类型为浮点型。\x0d\x0a代码实现如下:\x0d\x0along t; /*定义长整型变量t*/\x0d\x0at=(h*10n+1+5)/10; /*对h进行操作,得到值浮点型,t取值时取整数部分。10n+1为要扩大的倍数*/\x0d\x0ah=(float)t/10n; /*将t缩小10n倍,并转换成浮点型*/
首先,这个问题的解决方案取决于我们所需要的转换方式:是截断转换还是舍入转换;另一方面,它基本与我们需要转换的浮点数类型无关──无论是 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 类型。