Ошибка при нахождении среднего арифметического

Есть функция для нахождения среднего арифметического:

function average() {
    var sum = 0;
    for (var i = 0; i < arguments[i]; i++ ) sum += arguments[i];
    return sum == 0 ? sum : sum / arguments.length;
}

Если пишем так: average(2, 5, 5, 5); Получаем: 4,25

Вроде все хорошо, но если написать: average(5, 5, 5, 2); Получаем: 3.75

Подскажите, пожалуйста, почему так и как исправить?


Ответы (4 шт):

Автор решения: Александр Лесив

function average() {
    var sum = 0;
    for (var i = 0; i < arguments.length; i++ ){
       sum += arguments[i]
    };
    return sum == 0 ? sum : sum / arguments.length;
}

console.log(average(5, 5, 5, 2))

Вы допустили ошибку в условии цикла:

for (var i = 0; i < arguments[i]; i++ ){
       sum += arguments[i]
  };

Цикл выполнялся до тех пор, пока i меньше за i-тый элемент.

→ Ссылка
Автор решения: doox911
  1. arguments - deprecated.
  2. Старайтесь не помещать в циклы операции типа: args.length.
  3. Используйте ===

function average(...args) {
    let sum = 0;
    let args_length = args.length;
    
    for (let i = 0; i < args_length; i++ ) {
      sum += args[i];
    }
    
    return sum === 0 ? sum : sum / args_length;
}

console.log(average(5, 5, 5, 2));
console.log(average(2, 5, 5, 5));

→ Ссылка
Автор решения: Yugofx
function average(...args) {
    return args.reduce((sum, i) => sum + i, 0) / args.length || 0;
}

Совсем уж фриковый, но интересный способ нашел на подобном вопросе в глобальном SO. По записи короче всего.

function average(...args) {
     return eval(args.join('+')) / args.length || 0;
}
→ Ссылка
Автор решения: Qwertiy

ES5

function average() {
  var sum = 0;
  for (var i = 0; i < arguments.length; ++i) sum += arguments[i];
  return sum && sum / arguments.length;
}

console.log(average(5, 5, 5, 2))
console.log(average(5, -5))
console.log(average(0))
console.log(average())

ES6

function average(...args) {
  var sum = 0;
  for (var x of args) sum += x;
  return sum && sum / args.length;
}

console.log(average(5, 5, 5, 2))
console.log(average(5, -5))
console.log(average(0))
console.log(average())

→ Ссылка