【问题标题】:Manually implementing a rounding function in C在 C 中手动实现舍入函数
【发布时间】:2012-09-21 07:19:01
【问题描述】:

我编写了一个 C 程序(它是我项目的一部分)来将浮点值四舍五入到用户指定的给定精度。函数是这样的

     float round_offf (float num, int precision)

我在这个程序中所做的是将浮点数转换为字符串,然后对其进行处理。

但是有没有办法让数字本身保持浮动并实现相同。

例如。 num = 4.445 prec = 1 结果 = 4.4

【问题讨论】:

  • 嗯,你返回的舍入值转换为void
  • c中也有格式,那你为什么要使用单独的函数,即printf("%0.1f", a);
  • @H2CO3 - 哦,是的.. 我将它返回到 main 中,我用它来进一步处理。
  • @user1611753 你显然没有明白我评论的重点......如果你想返回值,你不能将你的函数声明为void......
  • 请注意,并非所有小数都可以精确地表示为浮点数,因此您不会总是得到预期的结果。

标签: c floating-point rounding


【解决方案1】:

当然有。很简单:

#include <math.h>

float custom_round(float num, int prec)
{
    int trunc = round(num * pow(10, prec));
    return (float)trunc / pow(10, prec);
}

编辑:在我看来你想要这个是因为你认为你不能在格式字符串中具有动态精度。显然,您可以:

int precision = 3;
double pie = 3.14159265358979323648; // I'm hungry, I need a double pie
printf("Pi equals %.*lf\n", precision, pie);

这打印出3.142

【讨论】:

  • 小心调用函数round:你需要为pow()包含math.h,这会使你的roundmath.h中的一个冲突
  • 这对否定的num 不正确。一种解决方法是使用... - 0.5 而不是... + 0.5 来表示否定。另一种方法是使用“round”(如果可以假定为 C99)或“floor”。
  • @MarkDickinson 再次:这取决于您认为“正确”的内容。没有“正确的舍入”之类的东西。有向正无穷大舍入(这种方法确实如此),向负无穷大舍入,从零舍入(您的方法建议),向零舍入,银行家四舍五入等。从角度来看,所有这些都是正确的一定的逻辑。
  • @H2CO3。不:我说的是custom_round(-2.2, 0) 返回-1.0 的事实。这肯定不是你想要的。
  • @H2CO3 - 我刚刚回答了他提出的使用输出格式说明符的建议。无论如何,这一点也很有帮助。但我想要的是你的第一个回复,这正是我所需要的。再次感谢你..
【解决方案2】:

是的:

float round_offf(float num, int precision)
{
  int result;
  int power;

  power = pow(10, precision + 1);
  result = num * power;
  if ((result % 10) > 5)
    result += 10;
  result /= 10;
  return ((float)result / (float)power);
}

【讨论】:

  • 什么是Math.pow?这是 JavaScript 吗?此外,这过于复杂。例如,用于检查舍入的if 是完全没有必要的......
  • 抱歉,是的,我花了太多时间在 C# 上养成了坏习惯。
  • 我似乎无法删除我的答案,奇怪。
  • @Swiss 我的意思不是粗鲁。这个答案并不真正符合 OP 的需求。
  • 谢谢大家的回答.. 这对我来说真的是一个很好的知识.. 谢谢大家
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
相关资源
最近更新 更多