C中的舍入函数

时间:2017-09-02 12:55:34

标签: c rounding

所以我试着编写一个代码,可以让我将任意数字向上舍入到3位小数。我用于舍入数字的代码是这样的:

for (rowIndex = 0; rowIndex < MAX_ROWS; rowIndex++)
{
    for (columnIndex = 0; columnIndex < MAX_COLUMNS; columnIndex++)
    {
         printf("%.3f ", ceil(rawData[rowIndex][columnIndex] * 1000.0) / 1000.0);
    }
}

但是昨天我的老师告诉我们使用一个具有这样结构的代码:

float roundValue(float value, int decimalPlaces)
{
      // Place rounding code here
      return value;
}

我不太确定如何以这种格式编写代码!我是编码的初学者,所以这可能太傻了。

更新: 所以我只是阅读下面的所有评论并尝试编写代码,但仍然有问题。我的代码是:

double roundValue(double value, int decimalPlaces)
{
value = roundf( value * pow(10, decimalPlaces)) / pow(10, decimalPlaces);
return value;
}
int main(void) 
{
int rowIndex = 0;
int columnIndex = 0;
double rawData[MAX_ROWS][MAX_COLUMNS]; // 2-dimensional array to store our 
raw data
double value = rawData[MAX_ROWS][MAX_COLUMNS];
int decimalPlaces = 3;
// Print out the roundup data array
printf(" --- ROUNDED DATA ---\n");
for (rowIndex = 0; rowIndex < MAX_ROWS; rowIndex++)
{
    for (columnIndex = 0; columnIndex < MAX_COLUMNS; columnIndex++)
    {
        printf("%.3f ", roundValue(value, 3));
    }
    printf("\n");
   }
   return 0;
}

它给了我所有数字只有0。

4 个答案:

答案 0 :(得分:1)

基于this answer,您可以使用roundf中的math.h功能:

#include <stdio.h>
#include <math.h>

/* function that rounds a float to the specified number of decimals */
float roundValue(float value, int decimalPlaces)
{
    value = roundf(value * pow(10, decimalPlaces)) / pow(10, decimalPlaces);
    return value;
}


/*to see the results: */
int main()
{
    float value = 12.34567;
    printf("%f", roundValue(value, 3));
    return 0;
}
  

汇编/运行:

$ gcc -lm main.c
$ ./a.out
12.346000

答案 1 :(得分:1)

他刚刚告诉你在一个可以在main()函数中调用的函数中编写代码。

因此,每次你需要一个圆值时,你可以使用一个函数,而不是重写你的代码,你给它一个你想要计算圆值的数字,它会给你结果,所以你的代码不会重复

答案 2 :(得分:0)

基本上它无法完成。问题是0.1或0.001不能精确地以浮点格式表示。因此,您只能舍入到最近的表示round = floor(x * 1000 + 0.5)/1000.0。最好使用双精度的完整精度,然后在最后一刻进行圆形展示。

printf("%.3g", x);

将为您实现这一目标。结合strtod,它也是另一种舍入技术。

答案 3 :(得分:0)

  

..将任意数字四舍五入到小数点后3位   我的老师告诉我们使用代码......比如float roundValue(float value, int decimalPlaces)

如果没有更高的精确度,那么非常难以以满足所有value的最佳答案来实现OP的目标。

将浮动指针值a)向上或b)舍入到最接近的可表示的0.001(或10 -n )通常是分步进行。

1)乘以10 n
2)向上舍入a)或b)到最近的
3)除以10 n

float roundValue(float value, int decimalPlaces) {
  // form the power of 10
  assert(decimalPlaces >= 0 && decimalPlaces <= 9);
  int power_of_10 = 1;
  while (decimalPlaces-- > 0) power_of_10 *= 10;
  double fpower_of_10 = power_of_10; // or just use `pow(10, decimalPlaces);

以10的幂进行缩放会导致不精确。在舍入步骤中放大了轻微错误。一个简单的解决方法是使用更高精度的数学。幸运的是,编码目标以float值开头,double通常具有更高的精度。

以10的幂为单位进行缩放可能会导致溢出,但valuefloat并且产品为double时,可能更宽的范围

  double y = value * fpower_of_10;

  // round
  double rounded_y = ceil(y);   // round up
  // or
  double rounded_y = round(y);  // round to nearest

商很少会提供0.001的精确倍数(或10的10次幂),但接近的浮点值是0.001的倍数。< / p>

  y = rounded_y / fpower_of_10;

  return y;
}

用法如下。回想一下,除非您的浮点类型使用FLT_RADIX == 10(这些天非常罕见,通常为2),结果只有接近所需的&#34;编号为n小数位。&#34;。如果做得好,结果将是最接近的float/double

 printf("%f\n", roundValue(123.456789, 3));
 printf("%.10f\n", roundValue(123.456789, 3)); // to see more 

更多:如果无法获得或使用更高的精度,则可以轻松避免溢出问题,即识别出大的C浮点值没有小数部分且不需要舍入。

float roundValue(float value, int decimalPlaces) {
  float int_ptr;
  float frac_part = modff(value, &int_ptr);
  if (frac_part == 0) return value;

  double pow10 = pow(10, decimalPlaces);
  return round(value * pow10)/pow10;  // or ceil()
}

这里没有提到其他一些细微的问题。 double roundingNaNrounding moderound()rint()nearbyint()