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

前端 未结 17 2695
孤城傲影
孤城傲影 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条回答
  • 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 <math.h>
    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.

    0 讨论(0)
  • 2020-11-22 03:41

    Using %.2f in printf. It only print 2 decimal points.

    Example:

    printf("%.2f", 37.777779);
    

    Output:

    37.77
    
    0 讨论(0)
  • 2020-11-22 03:42

    I made this macro for rounding float numbers. Add it in your header / being of file

    #define ROUNDF(f, c) (((float)((int)((f) * (c))) / (c)))
    

    Here is an example:

    float x = ROUNDF(3.141592, 100)
    

    x equals 3.14 :)

    0 讨论(0)
  • 2020-11-22 03:43

    Also, if you're using C++, you can just create a function like this:

    string prd(const double x, const int decDigits) {
        stringstream ss;
        ss << fixed;
        ss.precision(decDigits); // set # places after decimal
        ss << x;
        return ss.str();
    }
    

    You can then output any double myDouble with n places after the decimal point with code such as this:

    std::cout << prd(myDouble,n);
    
    0 讨论(0)
  • 2020-11-22 03:45

    Code definition :

    #define roundz(x,d) ((floor(((x)*pow(10,d))+.5))/pow(10,d))
    

    Results :

    a = 8.000000
    sqrt(a) = r = 2.828427
    roundz(r,2) = 2.830000
    roundz(r,3) = 2.828000
    roundz(r,5) = 2.828430
    
    0 讨论(0)
  • this function takes the number and precision and returns the rounded off number

    float roundoff(float num,int precision)
    {
          int temp=(int )(num*pow(10,precision));
          int num1=num*pow(10,precision+1);
          temp*=10;
          temp+=5;
          if(num1>=temp)
                  num1+=10;
          num1/=10;
          num1*=10;
          num=num1/pow(10,precision+1);
          return num;
    }
    

    it converts the floating point number into int by left shifting the point and checking for the greater than five condition.

    0 讨论(0)
提交回复
热议问题