【问题标题】:Can you round a value to 2 decimal places in C?你可以在 C 中将一个值四舍五入到小数点后 2 位吗?
【发布时间】:2014-02-21 23:53:29
【问题描述】:

我正在计算一个房间的体积,我得到了一个小数点后 6 位的数字。我想知道是否可以将值减少到小数点后 2 位。卷的结果数字来自 5 个不同的变量,我不知道在这种情况下是否重要。

【问题讨论】:

  • 是用来显示的吗,比如printf("%2f", var);

标签: c floating-point integer decimal rounding


【解决方案1】:

你可以使用 printf("%.2f", 20.233232)

【讨论】:

  • 在边缘情况下,printf() 可以在不同的系统上给出不同的结果。例如,gcc 使用 Banker's Rounding,但不是 MSVC 2010。
【解决方案2】:

在某个数学库的某处(我手头没有 C 引用)中可能有一个 round() 函数浮动(哈哈)。如果不是,一个快速而肮脏的方法是将数字乘以 100(小数点右移 2),加 0.5,截断为整数,然后除以 100(小数点左移 2)。

【讨论】:

    【解决方案3】:

    浮点值0.01 无法在 IEEE 754 中表示,因此您得到的小数仍然比您要求的多。

    更好的方法:只是不要在程序中显示多余的小数。我怀疑你“得到”了 6 位小数;它可能是普通的默认值

    printf ("too much accuracy in %f!", yourFloat);
    

    如果有,使用%.2f显示。

    稍微差一点的方法,取决于数值范围和您要执行的计算类型:将浮点数乘以 100,四舍五入,然后存储为整数。 100.00% 保证您只会获得两位数的准确度。除法(如果不小心操作,您会丢失 2 位数)和乘法(您会获得 2)时要小心。

    【讨论】:

      【解决方案4】:

      @Rashmi 解决方案提供了一个很好的圆整显示浮点值。
      它不会改变原始数字的值。

      如果想将浮点值四舍五入到最接近的0.01,请使用round()

      #include <math.h>
      double d = 1.2345;
      d = round(d * 100.0)/100.0;
      

      注意事项:

      由于 FP 的限制,四舍五入的值可能不是完全0.01 的倍数,而是给定平台允许的最接近的 FP 数。

      d 非常接近 x.xx5 时,(x 是 0-9 的各种数字)d * 100.0 在调用 round() 之前在乘积中引入了舍入。代码可能会以错误的方式舍入。

      【讨论】:

      • 我不认为它总是最接近的。乘以 100 将引入错误,可能会将 x.xx499999... 更改为 xxx.5,round 可能会增加,而所需的结果是减少。
      • @Eric Postpischil 我同意这一点。也许modf() 可能有帮助?我会考虑你的想法。
      猜你喜欢
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2011-11-12
      相关资源
      最近更新 更多