How do I restrict a float value to only two places after the decimal point in C?

前端 未结 17 2736
孤城傲影
孤城傲影 2020-11-22 03:22

How can I round a float value (such as 37.777779) to two decimal places (37.78) in C?

17条回答
  •  -上瘾入骨i
    2020-11-22 03:40

    Use float roundf(float x).

    "The round functions round their argument to the nearest integer value in floating-point format, rounding halfway cases away from zero, regardless of the current rounding direction." C11dr §7.12.9.5

    #include 
    float y = roundf(x * 100.0f) / 100.0f; 
    

    Depending on your float implementation, numbers that may appear to be half-way are not. as floating-point is typically base-2 oriented. Further, precisely rounding to the nearest 0.01 on all "half-way" cases is most challenging.

    void r100(const char *s) {
      float x, y;
      sscanf(s, "%f", &x);
      y = round(x*100.0)/100.0;
      printf("%6s %.12e %.12e\n", s, x, y);
    }
    
    int main(void) {
      r100("1.115");
      r100("1.125");
      r100("1.135");
      return 0;
    }
    
     1.115 1.115000009537e+00 1.120000004768e+00  
     1.125 1.125000000000e+00 1.129999995232e+00
     1.135 1.134999990463e+00 1.139999985695e+00
    

    Although "1.115" is "half-way" between 1.11 and 1.12, when converted to float, the value is 1.115000009537... and is no longer "half-way", but closer to 1.12 and rounds to the closest float of 1.120000004768...

    "1.125" is "half-way" between 1.12 and 1.13, when converted to float, the value is exactly 1.125 and is "half-way". It rounds toward 1.13 due to ties to even rule and rounds to the closest float of 1.129999995232...

    Although "1.135" is "half-way" between 1.13 and 1.14, when converted to float, the value is 1.134999990463... and is no longer "half-way", but closer to 1.13 and rounds to the closest float of 1.129999995232...

    If code used

    y = roundf(x*100.0f)/100.0f;
    

    Although "1.135" is "half-way" between 1.13 and 1.14, when converted to float, the value is 1.134999990463... and is no longer "half-way", but closer to 1.13 but incorrectly rounds to float of 1.139999985695... due to the more limited precision of float vs. double. This incorrect value may be viewed as correct, depending on coding goals.

提交回复
热议问题