【问题标题】:Double and Float format displaying different results显示不同结果的双精度和浮点格式
【发布时间】:2013-08-11 00:14:56
【问题描述】:

我认为 double 和 float 之间的区别在于小数的精度。但是,我使用 double 和 float 得到了奇怪的结果,而且它们彼此并不接近。

第一段代码与浮点格式一起使用,产生正确的结果:

#include <stdio.h>

#define ABSOLUTE_VALUE(number)      ( ((number) < 0) ? -(number) : (number) )

int main (void)
{
    float number, absNumber;


    printf ("What number do you want to check the absolute value for? : ");
    scanf  ("%f", &number);

    absNumber = ABSOLUTE_VALUE(number);

    printf ("The absolute value of %.2f is %.2f\n", number, absNumber);

    return 0;
}

输出:
您要检查哪个数字的绝对值? :-3
-3.00 的绝对值为 3.00

第二段代码与双重格式一起使用会产生不正确的结果:

#include <stdio.h>

#define ABSOLUTE_VALUE(number)      ( ((number) < 0) ? -(number) : (number) )

int main (void)
{
    double number, absNumber;


    printf ("What number do you want to check the absolute value for? : ");
    scanf  ("%d", &number);

    absNumber = ABSOLUTE_VALUE(number);

    printf ("The absolute value of %.2d is %.2d\n", number, absNumber);

    return 0;
}

输出:
您要检查哪个数字的绝对值? :-3
-03的绝对值为2147344384

【问题讨论】:

    标签: c floating-point double


    【解决方案1】:

    在第二个示例中,%d 用于整数。 (d 不是 double 的缩写,而是 decimal 的缩写)

    scanf  ("%d", &number);
    

    应该是

    scanf  ("%lf", &number);
    

    printf 也不正确,因为%f 用于double

    printf ("The absolute value of %.2d is %.2d\n", number, absNumber);
    

    相反,这应该是:

    printf ("The absolute value of %.2f is %.2f\n", number, absNumber);
    

    注意double 的格式说明符对于scanfprintf 是不同的,this C FAQ article 有一些很好的解释。

    【讨论】:

    • 不是%lf(这是给long double)而是%f
    • @BasileStarynkevitch 不,格式为scanf%f 用于float%lf 用于double。它的格式不同于printf
    • %lf 也可用于 print f,在这种情况下它与 %f 相同,因此可以使用。
    【解决方案2】:

    您最后的printf 格式字符串错误。应该是。

     printf ("The absolute value of %.2f is %.2f\n", number, absNumber);
    

    如果您启用所有编译器警告(例如,使用 gcc -Wall -g 编译),您将收到警告。始终在编译器中启用所有警告。

    您的scanf 也是错误的,应该是scanf("%lf", &amp;number); 并且编译器会警告您所有警告。

    顺便说一句,scanf 返回“成功匹配的项目数”,您应该测试其结果。

    您确实需要仔细阅读printf(3)scanf(3) 的文档。 (在 linux 终端中,你可以输入man 3 printf 来获取)。

    请注意,参数被转换为doubledouble-s 的转换说明符是printf 中的%fscanf 中的%lf

    您应该学习如何使用调试器(例如gdb)。

    【讨论】:

    • scanf 错误,%f 用于float%lf 用于double。它的格式不同于printf。我的答案是正确的。
    • 在我继续编程的过程中,从长远来看,调试器对我有用吗?
    • 在编码时使用调试器在实践中是绝对必要的,尤其是在 C 或 C++ 中......你真的需要学习它......
    【解决方案3】:

    在您的第二个程序中,您对 double 使用了 %d 格式说明符,这是错误的。这就是为什么你会出错。您应该使用 %lf (long float 或更好地称为 'double') 来打印它。 对于其他格式说明符, 我认为这可能会帮助你 a link
    您还可以通过输入“格式说明符”在 google 上搜索不同的格式说明符。

    【讨论】:

    • 这更像是一个评论而不是一个答案。
    • 但您可以转到该链接,并以更易于阅读和理解的表格形式了解哪个格式说明符用于哪个目的。
    • @Basile 告诉他这不是为了那个等等,我个人觉得可能会让他感到困惑。所以,我从我的角度告诉了我认为更好的方法
    【解决方案4】:

    为在 c 中使用 double 数据类型进行 2 处更改:

    use %lf in scanf
    use %f in printf
    
    //remember : %d is for int
                 %f is for float
                 %c is for char
    

    【讨论】:

      【解决方案5】:

      如果您阅读manual"%d" 是整数。你需要"%lf"

      printf 也一样

      【讨论】:

      • 所以 %d 用于整数?哦该死:(我不知道为什么我认为它也用于小数
      • 不,double 的格式说明符对于 scanfprintf 是不同的,请参阅我的答案。在printf 中是%f
      • @LinhSaysHi - 我的意思是格式不正确。应该更明确
      猜你喜欢
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 2018-07-06
      • 2020-05-28
      • 2017-05-20
      • 2013-03-04
      相关资源
      最近更新 更多