C 使用floorf减少小数位数

C 使用floorf减少小数位数,c,floating-point,floor,C,Floating Point,Floor,我想用数字的前五位来计算。 例如 浮点数:4.23654897E-05 我希望使用4.2365E-05。我尝试了以下方法 #include <math.h> #include <stdio.h> float num = 4.23654897E-05; int main(){ float rounded_down = floorf(num * 10000) / 10000; printf("%f",rounded_down); return 0; } #包括 #包括

我想用数字的前五位来计算。 例如 浮点数:4.23654897E-05

我希望使用4.2365E-05。我尝试了以下方法

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

float num = 4.23654897E-05;
int main(){
float rounded_down = floorf(num * 10000) / 10000;
printf("%f",rounded_down);
return 0;

}
#包括
#包括
浮点数=4.23654897E-05;
int main(){
向下四舍五入的浮动=地板(数量*10000)/10000;
printf(“%f”,向下舍入);
返回0;
}
输出为0.000000。所需输出为4.2365E-05。 简言之,假设分配了52位来存储尾数。有没有办法减少分配的位数


关于如何做到这一点有什么建议吗?

预期结果。乘以10000得到
0.423..
最接近它的整数是
0
。结果是0。可以使用格式说明符
%f
进行舍入,将结果打印到小数点后的某些小数位

如果您检查
floorf
的返回值,您将看到它返回
如果没有发生错误,则最大整数值不大于arg,即⌊arg⌋, 返回。
其中
arg
是传递的参数

不使用
floatf
您可以使用
%e
或(
%e
)格式说明符相应地打印它

printf("%.4E",num);
哪些产出:

4.2365E-05
在David的评论之后:

你做事的方式是对的,但你乘以的数字是错的。事情是
4.2365E-05
0.00004235…
。现在,如果将它与
10000
相乘,那么它将
0.42365..
。现在你说我希望表达式以这种形式表示<在这种情况下,code>floorf返回
float
。将它存储在一个变量中,您就可以开始了。舍入的值将在该变量中。但您将看到向下舍入的值将是
0
。这就是你得到的

float rounded_down = floorf(num * 10000) / 10000;
这将在
之后保留正确的四舍五入到4位数字的值(不是用
E
E
的指数表示法)。不要将该值与用于表示它的格式说明符混淆


为了得到想要的结果,您需要做的是将小数点向右移动。要做到这一点,请乘以更大的数字。(
1e7
1e8
或根据您的需要)。

预期结果。乘以10000得到
0.423..
最接近它的整数是
0
。结果是0。可以使用格式说明符
%f
进行舍入,将结果打印到小数点后的某些小数位

如果您检查
floorf
的返回值,您将看到它返回
如果没有发生错误,则最大整数值不大于arg,即⌊arg⌋, 返回。
其中
arg
是传递的参数

不使用
floatf
您可以使用
%e
或(
%e
)格式说明符相应地打印它

printf("%.4E",num);
哪些产出:

4.2365E-05
在David的评论之后:

你做事的方式是对的,但你乘以的数字是错的。事情是
4.2365E-05
0.00004235…
。现在,如果将它与
10000
相乘,那么它将
0.42365..
。现在你说我希望表达式以这种形式表示<在这种情况下,code>floorf返回
float
。将它存储在一个变量中,您就可以开始了。舍入的值将在该变量中。但您将看到向下舍入的值将是
0
。这就是你得到的

float rounded_down = floorf(num * 10000) / 10000;
这将在
之后保留正确的四舍五入到4位数字的值(不是用
E
E
的指数表示法)。不要将该值与用于表示它的格式说明符混淆

为了得到想要的结果,您需要做的是将小数点向右移动。要做到这一点,请乘以更大的数字。(
1e7
1e8
或根据您的需要)。

我想:

printf("%.6f", num);
或者您可以尝试使用
stdlib.h
中的
snprintf()

float num = 4.23654897E-05;  char output[50];

snprintf(output, 50, "%f", num);

printf("%s", output);
我会去:

printf("%.6f", num);
或者您可以尝试使用
stdlib.h
中的
snprintf()

float num = 4.23654897E-05;  char output[50];

snprintf(output, 50, "%f", num);

printf("%s", output);

正常范围内的正数
x
可向下舍入到大约五位有效数字,如下所示:

double l = pow(10, floor(log10(x)) - 4);
double y = l * floor(x / l);

这只在将浮点运算作为学习工具进行修补时有用。精确的数学结果通常不能精确表示,因为二进制浮点不能精确表示大多数十进制值。此外,在
pow
/
*
操作中可能会出现舍入错误,这可能会导致结果与将
x
舍入到五个有效数字的真实数学结果略有不同。此外,执行不良的
log10
pow
会导致结果与真实的数学结果不同。

正常范围内的正数值
x
可以四舍五入到大约五位有效数字:

double l = pow(10, floor(log10(x)) - 4);
double y = l * floor(x / l);
这只在将浮点运算作为学习工具进行修补时有用。精确的数学结果通常不能精确表示,因为二进制浮点不能精确表示大多数十进制值。此外,在
pow
/
*
操作中可能会出现舍入错误,这可能会导致结果与将
x
舍入到五个有效数字的真实数学结果略有不同。此外,对
log10
pow
执行不当可能会导致结果与真实数学结果不同

我想用数字的前五位来计算

一般来说,浮点数使用二进制编码,OP希望使用5位有效的十进制数字。这是有问题的,因为像
4.23654897E-05和
4.2365这样的数字