C中括号中的双精度

Double precision in parentheses in C

使用替身,我可以设置

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) return 9 而不是 9.8181...?

Why does (216/22) return 9 and not 9.8181...?

因为 216 和 22 都是 int - 结果是一个整数。

(216.0/22) 会 return 达到预期的两倍。

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

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

顺便说一句: double x = (216/22) //Outputs 9.00000...,您正在执行整数除法以将两个值都指定为双精度值: double x = 216.0/22.0double x = (double)216/(double)22

如果任一值的类型为 double 或转换为它,则结果的类型将为 double

#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

两个整数除法转换为双精度,然后是两个双精度除法。如果你没有得到,那么你的编译器或你的代码或处理实验的试验错误有问题。然后在解决 compiler/code 问题后,请参阅有关类型转换的 C 教程文档。您告诉编译器进行整数除法,这意味着没有小数余数,然后您将该整数 9 转换为双精度 9.0。对于另外两个,您要求编译器先将整数转换为双精度,然后进行双除法,这意味着您可以保留小数余数。

那么如果你这样做

#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 的情况有所不同。