【问题标题】:How do i format the output in C?如何在 C 中格式化输出?
【发布时间】:2010-02-11 10:09:52
【问题描述】:

我有这个学校作业的代码,但我无法格式化它。当我运行程序时,我不断得到 1.27768e-307。

lp->price 是 double 值,值为 1000000.0000000000

printf("Price of flat: %g\n", lp->price); 

有什么想法吗? 其他双精度值的格式正确,而不是价格。

【问题讨论】:

  • 您提供的代码应该可以工作。您有多确定没有任何东西会改变lp->price 的价值?如果您仍然感到困惑,请仔细检查并提供更多背景信息。

标签: c double printf


【解决方案1】:

请注意,浮点数据类型确实不适合表示货币。

那就试试吧:

printf("Price: %6f\n", lp->price);

%f 说明符不使用科学记数法。

【讨论】:

  • +1 用于突出显示不适当的数据类型。使用 int/long 表示(例如)美分数将消除许多算术问题,但会使处理舍入错误(例如添加销售税)和输出结果(转换为字符串并插入小数)变得更加棘手指向正确的位置)。
  • 为什么浮点类型(例如双精度)不适合表示货币?许多现代计算机具有内置的浮点处理,并且通常可以像整数一样快或更快地处理浮点数。浮点到整数之间的转换可能会浪费积分运算获得的任何值。
  • @Thomas:因为它们是浮点。一旦你有足够的美元,你就不再有任何美分了。数钱的人不喜欢这样数。此外,它们无法准确表示某些值,即使它们似乎足够精确。
  • 我们必须使用它,在作业说明中有说明。
【解决方案2】:

(1) 由于你使用的是双精度,你应该添加 l 长度说明符:

那不是真的。 l 长度说明符不用于 %e、%f 或 %g;无论如何,这些转换需要双倍。 (使用 L 长度说明符来取长双精度。)

因为 printf 是一个可变参数函数,如果你给它一个浮点数,它会自动将它提升为双精度。

【讨论】:

  • 不要发布 cmets 作为答案。
  • @tpr 和 @unwind +1,因为 tpr 是新的并且他的贡献增加了价值。
【解决方案3】:

确保您的 lp->price 确实是 double,而不是指向某物 (double*) 或某物数组 (double[]) 的指针。

【讨论】:

    【解决方案4】:

    %g 将以正常或指数格式打印您的双精度。 %f 适用于您始终需要十进制表示法的情况。

    另请参阅http://en.wikipedia.org/wiki/Printf#printf_format_placeholdershttp://man.cx/printf%283%29

    -- {编辑:我删除了这个答案,因为已经给出了另一个答案,但我意识到提及 %g 的作用会很有用}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      相关资源
      最近更新 更多