舍入浮点数的问题

时间:2017-07-13 02:54:41

标签: c floating-point

我有以下源代码,但结果不是四舍五入到小数点后两位。

#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?

2 个答案:

答案 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