所以我试着编写一个代码,可以让我将任意数字向上舍入到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。
答案 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的幂为单位进行缩放可能会导致溢出,但value
为float
并且产品为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 rounding,NaN,rounding mode,round()
与rint()
,nearbyint()
。