【问题标题】:Printf adding digitprintf 添加数字
【发布时间】:2013-04-14 17:57:04
【问题描述】:

我有一个小程序:

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,但这对我来说很神秘......

【问题讨论】:

  • 阅读“每个计算机科学家都应该了解的浮点运算知识”:docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
  • @SecurityMatt 问题是printf 的精度被指定为五位数。
  • 您确定该输出吗? ideone.com/VRj497
  • 无法复制,我的printf 尊重精度。你用的是什么编译器?
  • @SecurityMatt 对于printfl 长度修饰符 id 忽略了浮点数,只有scanf 系列才重要。可能是 OP 没有复制并且不小心输入了一个 0 太多。但我有点天真并假设最好。如果小数点后实际上只有五位数字(四个零),那么通常的浮点建议当然适用。

标签: c console printf


【解决方案1】:

使用双精度进行加法:

sum = num1;
sum += num2;

或应用一些强制转换:

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

【讨论】:

  • 问题是打印的小数点后的位数比指定的多,格式为%3.5f
【解决方案2】:

这与数字的精度有关。如果您对详细信息感兴趣,我建议您查看Wikipedia on this。它们的存储格式只能精确到一定程度。

要获得更高的准确度,请使用 double 类型:

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;
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-22
      • 2015-10-21
      • 2016-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 2020-02-15
      相关资源
      最近更新 更多