C语言中double型如何取整?如何取四舍五入?

时间:2021-04-16 09:46:15
double a = 123.456;
如何把这个数取整?
如何把取4舍五入的值?

以下方法可行么?
sprintf(b,".0f%",a)
sprintf(b,".0f%",a+0.5)

有没有可能出现 ".0f"自动就4舍五入?

16 个解决方案

#1


取整的话直接强制转换好了 (int)a

#2


double a = 123.456;

int b = (int)a;//取整
int c = (int)(a+0.5);//四舍五入

#3


取整:强制类型转换
double a = 123.455;
int n = (int)a;
四舍五入;
int m;
if((a - n) < 0.5)
   m = n;
else
   m = n + 1;

#4


int b = (int)a;//取整
int c = (int)(a+0.5);//四舍五入

#5


我在VC,TURBOC下面调试了
#include <stdio.h>
main()
{
   double a = 123.456,b=123.556;
   printf("%.0f,%.0f",a,b);

}
输出结果是123,124

#6


int c = (int)(a+0.5);//四舍五入
----
这个一定是四舍五入么?请编译和运行
#include <stdio.h>

int main(void)
{
    double d;
    int i, j;

    d = 9.499999999999999999999999999999999999;
    i = (int)(d);
    j = (int)(d + 0.5);

    (void) printf("i = %d\n", i);
    (void) printf("j = %d\n", j);

    getchar();

    return 0;
}

#7


C99里的round应该可以做到四舍五入,不过暂时未试验,在下的VC6不支持这个函数。
#include <math.h>

     double
     round(double x);

#8


int b = (int)a;//取整
int c = (int)(a+0.5);//四舍五入
=================================
这个应该是满足精度要求的.
至于mymtom() 举的例子.没有说服力. 实际上,4后面出现14个9的情况下,i和j都还是9.  当超过double所能表示的有效数位后,就没有意义了.

#9


int b = (int)a;//取整
int c = (int)(a+0.5);//四舍五入
=================================
这个应该是满足精度要求的.
至于mymtom() 举的例子.没有说服力. 实际上,4后面出现14个9的情况下,i和j都还是9.  当超过double所能表示的有效数位后,就没有意义了.
=================================
确实没有说服力,i和j的输出都是10

#10


int b = (int)a;//取整
int c = (int)(a+0.5);//四舍五入
=================================
这个应该是满足精度要求的.
至于mymtom() 举的例子.没有说服力. 实际上,4后面出现14个9的情况下,i和j都还是9.  当超过double所能表示的有效数位后,就没有意义了.
=================================
确实没有说服力,i和j的输出都是10
=================================
错了i是9,j是10

#11


d = 9.499999999999999999999999999999999999;
=====================
问题是当你的9多过double表示的有效数字位后,编译器已经把这个数解释为9.50了.
或者说我的精度要求是10个9或8个9,后面还有数字,则我都可以把它看成9.50了.
double数本来就不可以绝对精确.

#12


楼上正解!

#13


对,在turbo c中 double 有效数字是15~16位

#14


第二题,CB测试
int sign(long x)
{
  float t;
  AnsiString tx;
  t=x/((abs(x)+0.1)*1.0);
  tx.sprintf( "%.0f",t);
  t=StrToInt(tx);
  return t; 
}

#15


引用 2 楼 lidongri 的回复:
double   a   =   123.456;

int   b   =   (int)a;//取整
int   c   =   (int)(a+0.5);//四舍五入

高手

#16


强转就行了嘛。。。

#1


取整的话直接强制转换好了 (int)a

#2


double a = 123.456;

int b = (int)a;//取整
int c = (int)(a+0.5);//四舍五入

#3


取整:强制类型转换
double a = 123.455;
int n = (int)a;
四舍五入;
int m;
if((a - n) < 0.5)
   m = n;
else
   m = n + 1;

#4


int b = (int)a;//取整
int c = (int)(a+0.5);//四舍五入

#5


我在VC,TURBOC下面调试了
#include <stdio.h>
main()
{
   double a = 123.456,b=123.556;
   printf("%.0f,%.0f",a,b);

}
输出结果是123,124

#6


int c = (int)(a+0.5);//四舍五入
----
这个一定是四舍五入么?请编译和运行
#include <stdio.h>

int main(void)
{
    double d;
    int i, j;

    d = 9.499999999999999999999999999999999999;
    i = (int)(d);
    j = (int)(d + 0.5);

    (void) printf("i = %d\n", i);
    (void) printf("j = %d\n", j);

    getchar();

    return 0;
}

#7


C99里的round应该可以做到四舍五入,不过暂时未试验,在下的VC6不支持这个函数。
#include <math.h>

     double
     round(double x);

#8


int b = (int)a;//取整
int c = (int)(a+0.5);//四舍五入
=================================
这个应该是满足精度要求的.
至于mymtom() 举的例子.没有说服力. 实际上,4后面出现14个9的情况下,i和j都还是9.  当超过double所能表示的有效数位后,就没有意义了.

#9


int b = (int)a;//取整
int c = (int)(a+0.5);//四舍五入
=================================
这个应该是满足精度要求的.
至于mymtom() 举的例子.没有说服力. 实际上,4后面出现14个9的情况下,i和j都还是9.  当超过double所能表示的有效数位后,就没有意义了.
=================================
确实没有说服力,i和j的输出都是10

#10


int b = (int)a;//取整
int c = (int)(a+0.5);//四舍五入
=================================
这个应该是满足精度要求的.
至于mymtom() 举的例子.没有说服力. 实际上,4后面出现14个9的情况下,i和j都还是9.  当超过double所能表示的有效数位后,就没有意义了.
=================================
确实没有说服力,i和j的输出都是10
=================================
错了i是9,j是10

#11


d = 9.499999999999999999999999999999999999;
=====================
问题是当你的9多过double表示的有效数字位后,编译器已经把这个数解释为9.50了.
或者说我的精度要求是10个9或8个9,后面还有数字,则我都可以把它看成9.50了.
double数本来就不可以绝对精确.

#12


楼上正解!

#13


对,在turbo c中 double 有效数字是15~16位

#14


第二题,CB测试
int sign(long x)
{
  float t;
  AnsiString tx;
  t=x/((abs(x)+0.1)*1.0);
  tx.sprintf( "%.0f",t);
  t=StrToInt(tx);
  return t; 
}

#15


引用 2 楼 lidongri 的回复:
double   a   =   123.456;

int   b   =   (int)a;//取整
int   c   =   (int)(a+0.5);//四舍五入

高手

#16


强转就行了嘛。。。