Konstantinos Natsios
Konstantinos Natsios

Reputation: 2924

Javascript Sum and Average of Array strange issue

Hey guys i have this weird issue with a javascript array that i want to calculate the sum and average of it.

So i have a prompt with an input and i'm asking the users to enter some numbers.

var sums = false;
var numbersArray = [];

function calculateAverage() {
  while (sums == false) {
    var numbers = prompt("Enter Integers.", "");
    if (numbers != null) {
      console.log(numbers);
      numbersArray.push(numbers);


    } else {
      var sum = 0;
      console.log(numbersArray);
      for (var i = 0; i < numbersArray.length; i++) {
        sum += numbersArray[i];
      }

      var avg = sum / numbersArray.length;
      console.log(avg);
      sums = true;
    }
  }
}

 calculateAverage();

So from console logs i get the following prints

4
5
1
["4", "5", "1"]
150.33333333333334

How can this be possible?

Ok my bad! Gonna accept the first answer though cause you are all correct !

Upvotes: 1

Views: 258

Answers (9)

Bugs Bunny
Bugs Bunny

Reputation: 47

I see that you've found a solution already, but I've been using an easier package called Shortcuts. You can use const short = require('@testgrandma/shortcuts'); to install it and then for this script you can do

short.arrayave([array]);

It'll return you the average of the array.

https://www.npmjs.com/package/@testgrandma/shortcuts

Upvotes: 0

Viplock
Viplock

Reputation: 3319

Just do parseInt before adding

var sums = false;
var numbersArray = [];

function calculateAverage() {
  while (sums == false) {
    var numbers = prompt("Enter Integers.", "");
    if (numbers != null) {
      console.log(numbers);
      numbersArray.push(numbers);


    } else {
      var sum = 0;
      console.log(numbersArray);
      for (var i = 0; i < numbersArray.length; i++) {
        sum += parseInt(numbersArray[i]);
      }

      var avg = sum / numbersArray.length;
      console.log(avg);
      sums = true;
    }
  }
}

 calculateAverage();

Upvotes: 3

Rajshekar Reddy
Rajshekar Reddy

Reputation: 19007

How can this be possible?

Right now you are dealing with array of strings hence the behavior.

Convert the string into numeric values and this should be fixed. To change string to numeric use parseInt()

numbersArray.push(parseInt(numbers,10));

Upvotes: 2

Sankar
Sankar

Reputation: 7117

Need to use ParseInt()

var sums = false;
var numbersArray = [];
calculateAverage();

function calculateAverage() {
  while (sums == false) {
    var numbers = prompt("Enter Integers.", "");
    if (numbers != null) {
      console.log(numbers);
      numbersArray.push(numbers);


    } else {
      var sum = 0;
      console.log(numbersArray, numbersArray.length);
      for (var i = 0; i < numbersArray.length; i++) {
        sum += parseInt(numbersArray[i]);

      }
      console.log(sum);
      var avg = sum / numbersArray.length;
      console.log(avg);
      sums = true;
    }
  }
}

Upvotes: 2

vijay
vijay

Reputation: 926

You need to add parseInt to sum the integers otherwise 4,5,1 will joined to form 451 and average 451/3 = 150.33333

var sums = false;
var numbersArray = [];

function calculateAverage() {
  while (sums == false) {
    var numbers = prompt("Enter Integers.", "");
    if (numbers != null) {
      console.log(numbers);
      numbersArray.push(numbers);


    } else {
      var sum = 0;
      console.log(numbersArray);
      for (var i = 0; i < numbersArray.length; i++) {
        sum += parseInt(numbersArray[i]);
      }

      var avg = sum / numbersArray.length;
      console.log(avg);
      sums = true;
    }
  }
}
window.onload = calculateAverage();

Upvotes: 2

Nitheesh
Nitheesh

Reputation: 20006

Use parseFloat or parseInt method to convert string to nuber before adding. Please find the attached code.

<!DOCTYPE html>
<html>

<script>
    var sums = false;
    var numbersArray = [];

    function calculateAverage() {
        while (sums == false) {
            var numbers = prompt("Enter Integers.", "");
            if (numbers != null) {
                console.log(numbers);
                numbersArray.push(numbers);


            } else {
                var sum = 0;
                console.log(numbersArray);
                for (var i = 0; i < numbersArray.length; i++) {
                    sum += parseFloat(numbersArray[i]);
                }

                var avg = sum / numbersArray.length;
                console.log(avg);
                sums = true;
            }
        }
    }
    calculateAverage();
</script>

<body>
</body>

</html>

Upvotes: 2

Azad
Azad

Reputation: 5272

convert the user entered variable to integer before push into array

numbersArray.push(+ numbers);

Upvotes: 2

FCin
FCin

Reputation: 3925

sum += numbersArray[i];

It should be

sum += parseInt(numbersArray[i]);

Because without it you add another char to your string.

Upvotes: 2

Deep
Deep

Reputation: 9794

Convert string to integer before pushing into the Array

Use parsInt

numbersArray.push(parseInt(numbers));

var sums = false;
var numbersArray = [];

function calculateAverage() {
  while (sums == false) {
    var numbers = prompt("Enter Integers.", "");
    if (numbers != null) {
      console.log(numbers);
      numbersArray.push(parseInt(numbers));


    } else {
      var sum = 0;
      console.log(numbersArray);
      for (var i = 0; i < numbersArray.length; i++) {
        sum += numbersArray[i];
      }

      var avg = sum / numbersArray.length;
      console.log(avg);
      sums = true;
    }
  }
}

calculateAverage();

Upvotes: 3

Related Questions