C 使用floorf减少小数位数
我想用数字的前五位来计算。 例如 浮点数:4.23654897E-05 我希望使用4.2365E-05。我尝试了以下方法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; } #包括 #包括
#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这样的数字