C错误的总和结果与双打

时间:2012-02-15 16:30:00

标签: c printf

我在那里。

我正在学习C,我有这段代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double buyval, deliveredval, change;

    printf("What's the buy value? ");
    scanf("%lf", &buyval);

    do{
        printf("What's the value delivered? ");
        scanf("%lf", &deliveredval);

        if (deliveredval < buyval){
            printf("Delivered value must be greater then buy value \n\n");
        }
    } while (deliveredval < buyval);

    change = deliveredval - buyval;

    printf("Change is %4.2lf", change);
    return 0;
}

使用此代码,最后一次打印始终为0.00但是我更改了

printf("Change is %4.2lf", change);

printf("Change is %4.2f", change);

它按预期工作。这是为什么?双打未格式化为lf?

3 个答案:

答案 0 :(得分:5)

"%f"适用于double s(和float s,它们会自动转换为double; %Lf用于long double。 您可以在printf(或C99 Standard)中阅读有关PDF说明符的所有内容。

格式说明符l中的"%lf"无效:"%lf"(与"%f"相同)是打印double s。

您的结果应与任何理智的C99编译器/实现相同。

根据我的文件,在C89中,"%lf"是无效的格式说明符;如果您使用的是C89编译器/实现,则使用它是未定义的行为。


请注意scanf的规则略有不同。

答案 1 :(得分:3)

在变量参数列表中,float值会自动转换为double; charshortint。因此,printf只需要%f double值(浮点值转换为)。

指针未被转换 - 这没有多大意义。这就是为什么scanf需要区分%f目标float%lf double目标的原因。

答案 2 :(得分:-1)

您应该使用%f来打印双打。 %lf只适用于长双打。