C中括号内的双精度

时间:2016-01-26 01:16:48

标签: c floating-point double precision

使用双,我可以设置

double x = 216/22            //Output's 9.818181...

然而,当我尝试:

double x = (216/22)          //Outputs 9.00000...
double x = ((double)216/22)  //Outputs 9.0000...
double x = (216/(double)22)  //Outputs 9.818181...

为什么(216/22)返回9而不是9.8181 ......?

4 个答案:

答案 0 :(得分:3)

  

为什么(216/22)返回9而不是9.8181 ......?

因为216和22都是int - 结果是int。

(216.0/22)会按预期返回两倍。

答案 1 :(得分:3)

#include <stdio.h>

int main ( void )
{
    double w = 216/22;
    double x = (216/22);
    double y = ((double)216/22);
    double z = (216/(double)22);

    printf("w %lf\n",w);
    printf("x %lf\n",x);
    printf("y %lf\n",y);
    printf("z %lf\n",z);
    return(0);
}

完全按预期输出

w 9.000000
x 9.000000
y 9.818182
z 9.818182

两个整数除法转换为double,然后是两个double divisions。如果你没有得到它,那么你的编译器或你的代码或处理实验的导频错误就会出现问题。然后在解决编译器/代码问题后,请参考有关类型转换的C教程文档。你告诉编译器进行整数除法,这意味着没有小数余数,然后你将整数9转换为双9.0。对于另外两个,你要求编译器将整数转换为double然后再进行双重除法,这意味着你可以保留小数余数。

然后,如果你这样做

#include <stdio.h>

union
{
    unsigned int ui[2];
    double d;
} myun;

int main ( void )
{
    double w = 216/22;
    double x = (216/22);
    double y = ((double)216/22);
    double z = (216/(double)22);
    unsigned int r = (1/10)*10;
    unsigned int s = ((double)1/10)*10;
    unsigned int t = (1/10.0)*10;

    printf("w %lf\n",w);
    printf("x %lf\n",x);
    printf("y %lf\n",y);
    printf("z %lf\n",z);
    printf("r %u\n",r);
    printf("s %u\n",s);
    printf("t %u\n",t);
    return(0);
}

你得到了

w 9.000000
x 9.000000
y 9.818182
z 9.818182
r 0
s 1
t 1

完全符合预期。

这不会改变此测试的输出

unsigned int t = (1/10.0F)*10;

但它做的不同于没有F的东西。

答案 2 :(得分:1)

double x = (216/22) 被解释为两个整数,然后结果被转换为double。如果您想在不进行强制转换的情况下执行此操作并保持精度,请执行以下操作:

double x = (216.0/22.0) // outputs 9.818181...

答案 3 :(得分:0)

按行: double x = (216/22) //Outputs 9.00000...,您正在执行整数除法以将两个值都指定为double: double x = 216.0/22.0double x = (double)216/(double)22

如果其中任何一个值属于double类型或已转换为它,则结果将为double类型。