【问题标题】:Round up a float number that has a non-zero decimal digit将具有非零十进制数字的浮点数四舍五入
【发布时间】:2014-03-02 04:36:59
【问题描述】:

我今天早些时候询问了半数的问题,并从@alk 那里得到了很大的帮助。在那篇文章中,我的想法是将 4.5 舍入到 5,但将 4.4 舍入到 4。@alk 给出的解决方案是:

int round_number(float x)
{
 return x + 0.5;
}

而且效果非常好!

在这篇文章中,我想讨论如何在 C 中实现 ceil() 函数。 与@alk 给出的最后一个解决方案相同,我想出了以下内容:

int round_up(float y)
{
   return y + 0.99999999;
}

这适用于所有情况,但浮点数 y 为 0.00000001 时除外。我想知道是否有更好的方法来做与 C 中的 ceil() 相同的事情。

【问题讨论】:

  • 你问的问题是如何四舍五入然后在你所说的ceil()函数的内容中。那是完全不同的。你应该编辑它
  • 我认为没有办法在不使用浮点格式的情况下可靠地做到这一点。

标签: c rounding ceil


【解决方案1】:

除非您可靠地知道 float 的 epsilon(我不确定标准 C 是否提供该值),否则我认为您会被 return (y < 0 || y == (int)y) ? y : y + 1; 卡住

【讨论】:

  • 好收获;我稍作修改以处理负值。
【解决方案2】:

这对负数失败。

int round_up(float y) {
 return y + 0.99999999;
}

但让我们利用它来发挥我们的优势。 floatint 的转换是向 0.0 截断。因此,负数正在执行“向上取整”或“上限”功能。当我们有一个肯定的float 时,转换为int 注意这是一个“地板”功能。当y 不是整数时进行调整。

(假设yINT_MIN ... INT_MAX 内。)

int ceil(float y) {
   if (y < 0) {
     return y;  // this does a ceiling function as y < 0.
   }
   int i = y; // this does a floor function as y >= 0.
   if (i != y) i++;
   return i;
 }

void ceil_test(float y) {
   printf("%f %d\n", y, ceil(y));
}

【讨论】:

  • @Lưu Vĩnh Phúc -2.5 的上限是 -2,而不是 -1。
【解决方案3】:

第一个 sn-p 对负数工作不正确。 -3.5 将是 -3,而不是 -4。正确使用舍入值

int round_number(float x)
{
    if (x >= 0)
        return x + 0.5f;
    else
        return x - 0.5f
}

即使这样,2 个值仍然不正确。见Why does Math.round(0.49999999999999994) return 1?。注意需要使用f后缀来获取float字面量,否则操作会在double精度下完成,然后向下转换回float

对于上限,加1就足够了

int ceiling(float x)
{
    if (x < 0 || (int)x == x)
        return x;
    else
        return x + 1.0f;
}

当 x 是整数时,例如x = 3.0(或 -3.0),它返回 3(或 -3)。对于 x = 3.1 它返回 4,对于 x = -3.1 它返回 -3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多