C 数字加法

C 数字加法,c,console,printf,C,Console,Printf,我有一个小程序: int main(int argc, const char * argv[]) { float num1; float num2; num1 = 21.2; num2 = 13.6; double sum; sum = num1 + num2; printf("The sum of two numbers is %3.5f. \n", sum); return 0; } 当它打印到控制台时,我得到的

我有一个小程序:

int main(int argc, const char * argv[])
{

    float num1;
    float num2;

    num1 = 21.2;
    num2 = 13.6;

    double sum;

    sum = num1 + num2;

    printf("The sum of two numbers is %3.5f. \n", sum);


    return 0;
}
当它打印到控制台时,我得到的是:

两个数字之和为34.800003


为什么我会在小数点后得到3?试图理解Printf,但这对我来说很神秘……

使用双精度进行加法:

sum = num1;
sum += num2;
或应用一些铸造:

sum = (double) num1 + (double) num2;

这与数字的精确性有关。如果你对细节感兴趣,我建议你去看看。存储它们的格式仅在一定程度上是准确的

要获得更高的精度,请使用双精度类型:


c中的每件事都是以位完成的,只需打印num1和num2的十六进制值。u缺少的是0.2和0.6不能在c中精确定义u不能在c中获得正确的位。在c中,小数点是
以2的幂的负数计算。从十进制到二进制的转换低于2^-1*b1+2^-2*b2+2^-3*b3,这就是c在c中计算浮点数的方式

阅读每一位计算机科学家都应该知道的关于浮点运算的知识:@SecurityMatt问题是printf的精度被指定为五位数。你确定这个输出吗?无法复制,我的打印尊重精度。您使用的编译器是什么?@SecurityMatt For printf,浮点数字的l长度修饰符id被忽略,这只是scanf家族的问题。可能是OP没有复制,意外地输入了一个0太多。但我有点幼稚,我认为最好的。如果十进制四个零后实际上只有五位数字,那么通常的浮点建议当然适用。问题是十进制后打印的数字比指定的多,格式为%3.5f。
int main(int argc, const char * argv[])
{

    double num1;
    double num2;

    num1 = 21.2;
    num2 = 13.6;

    double sum;

    sum = num1 + num2;

    printf("The sum of two numbers is %3.5f. \n", sum);


    return 0;
}