在C中创建舍入(浮点)函数时出错

在C中创建舍入(浮点)函数时出错,c,function,rounding,C,Function,Rounding,我正在尝试编写一个向上取整函数,将浮点数转换为整数,但我获取浮点数%1剩余部分的小数位数的方法似乎有错误。如果浮点数是4.4,我想把它转换成4;如果是4.5,我想把它转换成5。 错误消息:错误:二进制%的无效操作数具有“float”和“int” 这样做: int round_zero_digits(float x) { return x + 0.5; } 或更一般的: #include <math.h> /* for pow() */ ... float round_n_

我正在尝试编写一个向上取整函数,将浮点数转换为整数,但我获取浮点数%1剩余部分的小数位数的方法似乎有错误。如果浮点数是4.4,我想把它转换成4;如果是4.5,我想把它转换成5。 错误消息:错误:二进制%的无效操作数具有“float”和“int”

这样做:

int round_zero_digits(float x)
{
  return x + 0.5;
}
或更一般的:

#include <math.h> /* for pow()  */

...

float round_n_digits(float x, unsigned int n)
{
  x *= pow(10., n);

  x = (int) (x + 0.5);

  while (n--)
  {
    x /=10.;
  }

  return x;
}
用纯C'ish的方式更新^2:

使用ROUND\u ZERO\u DIGITS作为函数ROUND\u ZERO\u DIGITS的宏版本。

如下操作:

int round_zero_digits(float x)
{
  return x + 0.5;
}
或更一般的:

#include <math.h> /* for pow()  */

...

float round_n_digits(float x, unsigned int n)
{
  x *= pow(10., n);

  x = (int) (x + 0.5);

  while (n--)
  {
    x /=10.;
  }

  return x;
}
用纯C'ish的方式更新^2:

将舍入零位作为函数舍入零位的宏版本。

尝试以下操作:

int round_up(float x)
{
    if ( (int) x == x ) return x;
    else return x + 1;
}
试试这个:

int round_up(float x)
{
    if ( (int) x == x ) return x;
    else return x + 1;
}


为什么不直接使用round函数呢float/double没有可以使用的余数运算符。我的作业不允许使用数学。h,这只是我作业的一小部分,用于实现同步屏障算法传播请将“向上取整”更改为“向上取整”或在问题正文中提及。人们认为您正在尝试实现ceil。为什么不使用round函数呢float/double没有可以使用的余数运算符。我的作业不允许使用数学。h,这只是我作业的一小部分,用于实现同步屏障算法传播请将“向上取整”更改为“向上取整”或在问题正文中提及。人们认为你在试图实现ceil。@ThoAppelsin:当然?您对此进行了测试吗?提供的功能是正确的。如果x为0.4,则x+0.5为0.9。return语句隐式转换为返回类型int,隐式转换将把它截断为0,这是您想要的。显式强制转换,例如返回intx+0.5;可能会更清楚。如果你想在其中找到漏洞,你可以考虑0.5的舍入是否为你所期望的。向上取整应该是向上取整的一半,这是正确的解决方案。0.4应该向下取整为0,这是基于alk的解决方案。谢谢。@alk,非常感谢。你的回答很优雅@索波辛:当然可以?您对此进行了测试吗?提供的功能是正确的。如果x为0.4,则x+0.5为0.9。return语句隐式转换为返回类型int,隐式转换将把它截断为0,这是您想要的。显式强制转换,例如返回intx+0.5;可能会更清楚。如果你想在其中找到漏洞,你可以考虑0.5的舍入是否为你所期望的。向上取整应该是向上取整的一半,这是正确的解决方案。0.4应该向下取整为0,这是基于alk的解决方案。谢谢。@alk,非常感谢。你的回答很优雅!0会返回1.0.1会返回1,但仍然与质疑的结果不匹配?@Joe没问题bro@alk正如在评论中所指出的,我们得出的答案是,它是四舍五入的。如果只是半个回合,那么我同意你的回答+0.50。会返回1.0.1会返回1,但仍然与质疑的结果不匹配?@Joe没问题bro@alk正如在评论中所指出的,我们得出的答案是,它是四舍五入的。如果只是半个回合,那么我同意你+0.5的回答