【问题标题】:How to round exactly without zeroes for doubles in C [duplicate]如何在C中精确舍入不为零的双精度[重复]
【发布时间】:2016-03-26 08:56:44
【问题描述】:

我有一个添加双打的程序,但我希望它能够显示不带零的确切数字。例如,我添加了 13.4 和 10.05。它将显示 23.450000。如何在不使用 %.2lf 的情况下显示 23.45。我不能使用 %.2lf 因为如果我添加 12.4 和 10.1 它会显示 22.50 但它只需要显示 22.5。抱歉英语不好。

【问题讨论】:

  • 它表明”是用什么方法? printf()?
  • 22.522.50 不同,因为 22.5 也可以是 22.4922.51 舍入。因此,如果您实际上有 22.50,则显示 22.5 会失去精度(“信息”)。那么,如果您有22.50,为什么还要显示22.5
  • 为什么要避免使用%.2lf 格式?

标签: c


【解决方案1】:

以下不是完整的解决方案,而是一些关于您可能希望如何处理问题的提示。

您想要的只有通过首先计算您的输入数字有多少小数位才能实现 - 这决定了您在输出中需要多少小数位。显然,只有当您有数字的字符串表示形式时,这才有效。

/* necessary casts removed for clarity */
int fractionalDigs1 = arg1 + strlen(arg1) - strchr (arg1, '.') - 1;
int fractionalDigs2 = arg2 + strlen(arg2) - strchr (arg2, '.') - 1;

对于两个数字相加,您可能希望输出小数位数为两个输入参数的分数中的最大值,然后相乘 - 由您决定。

int fractionalDigsOut = max (fractionalDigs1, fractionalDigs2);

具有非常量字段宽度的输出与字段宽度格式说明符 * 一起使用,就像这样(* 从参数列表中获取一个参数并将其用作字段宽度):

printf ("%8.*f", fractionalDigitsOut, num);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2017-06-10
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    相关资源
    最近更新 更多