我有以下源代码,但结果不是四舍五入到小数点后两位。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main(int argc, char *argv[])
{
float x1=0;
float x2 = 0;
float result=0;
x1 = 8961.650391;
result = x1 * 100 + 0.5;
result = (float)floor(result);
printf("Result = <%f>\n", result);
result = result/100;
x2 = result;
printf("x2 = <%f>\n", x2);
return 0;
}
请帮助解决问题。
Result = <896165.000000>
x2 = <8961.650391>
如何获得x3 = 8961.650000?
答案 0 :(得分:3)
使用“%0.2f”代替%f,它将打印值最多2位小数
x2= roundf(result * 100) / 100;
printf("x2 = <%0.2f>\n", x2);
答案 1 :(得分:2)
float
通常可以准确地代表大约2 32 不同的数字
毕竟,它是typically encoded using 32-bits。
8961.65不是其中之一。最接近的float
到8961.65是8961.650390625f
。以下显示了之前和之后的float
。
要将float
打印到最接近的0.01,请@pritesh agrawal使用"%.2f"
作为建议。
使用rint()
或round()
推荐四舍五入。
int main(void) {
float x = 8961.650391f;
float x100 = rint(x * 100.0);
float result = x100 / 100.0f;
printf("%f %.2f\n", nextafterf(x, 0), nextafterf(x, 0));
printf("%f %.2f\n", x, x);
printf("%f %.2f\n", nextafterf(x, x * 2), nextafterf(x, x * 2));
printf("%f %.2f\n", x100, x100);
printf("%f %.2f\n", result, result);
return 0;
}
输出
8961.649414 8961.65
8961.650391 8961.65
8961.651367 8961.65
896165.000000 896165.00
8961.650391 8961.65
如何获得x3 = 8961.650000?
x3
无法具有8961.650000
的确切值。要打印一个值,四舍五入到2个小数位后跟4个零,可以使用下面的值,但它有点chicanery。
printf("%.2f0000\n", 8961.650390625f);
// output 8961.650000