Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Double rounding error even when calculating small numbers

I have this super simple code for calculating averages of given even and odd numbers, until the user gives 0. (I would use for loop but we can’t).
I’m having a really strange problem with program rounding results like 25/2 is 2.00000. Sorry if this question is stupid but I just can’t find a problem.
What am I doing completely wrong?

#include <stdio.h>
#include <stdlib.h>

void funkcja()
{
    int sumaNiep = 0;
    int sumaPa = 0;
    int userInput = 1;
    int i = 0;

    while(userInput != 0)
    {
        //wprow zmiennej
        printf("%d. Podaj calkowita liczbe: ", i+1);
        scanf("%d", &userInput);

        //jesli parzysta
        if (userInput % 2 == 0)
        {
            sumaPa += userInput;
        } else {
            sumaNiep += userInput;
        }
        i++;
    }

    double sredniaNiep = sumaNiep/(i-1);
    double sredniaPa = sumaPa/(i-1);

    printf("\nsrednia parzysta %d / %d : %lf", sumaPa, i, sredniaPa);
    printf("\nsrednia parzysta %d / %d : %lf", sumaNiep, i, sredniaNiep);

}


int main()
{
    funkcja();
}

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

The problem is that you do an integer division at the end.

You should break out of the loop if the user enters 0 and make at least one operand a double when you do the division. You also need to count the number of evens and odds:

#include <stdio.h>
#include <stdlib.h>

void funkcja() {
    int sumaNiep = 0;
    int sumaPa = 0;
    int userInput = 1;
    int iPa = 0;
    int iNiep = 0;
    int i = 0;

    while(1) {
        printf("%d. Podaj calkowita liczbe: ", ++i);
        if(scanf(" %d", &userInput) != 1 || userInput == 0) break; // break out

        // jesli parzysta
        if(userInput % 2 == 0) {
            sumaPa += userInput;
            ++iPa;                  // count evens
        } else {
            sumaNiep += userInput;
            ++iNiep;                // count odds
        }
    }
    if(iPa) { // avoid div by zero
        double sredniaPa = (double)sumaPa / iPa;       // double div
        printf("srednia parzysta %d / %d : %lf\n", sumaPa, iPa, sredniaPa);
    }
    if(iNiep) { // avoid div by zero
        double sredniaNiep = (double)sumaNiep / iNiep; // double div
        printf("srednia parzysta %d / %d : %lf\n", sumaNiep, iNiep, sredniaNiep);
    }
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading