Задать вопрос
@s24344

Как округлить число?

Всем привет. Ребята, подскажите, как решить задачу.
У меня, к примеру, есть массив цифр:
const arrayNumbers = [-5, 0, 5, 10, 15, 20, 25, 30, 35]
const n = 23.45
const res = null

Моя задача в следующем, 23.45, ближе всего к числу 25 (из массива), в переменную res мне необходимо записать именно это число 25.
Если придет, например, 11,38, то в переменную res нужно записать число 10 (число из массива).
  • Вопрос задан
  • 149 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 5
profesor08
@profesor08 Куратор тега JavaScript
Во первых, `res` у тебя константа, и, после объявления, записать туда ничего не выйдет. После устранения косяка приступай к написанию алгоритма, он просто как пробка. Проходишь по каждому элементу из массива и вычитаешь его из твоего числа, ответом будет то число, результат вычитания которого будет наименьшим. Обойти массив можно с помощью оператора `for` или метода `forEach`, значения сравниваются оператором `if`.
https://developer.mozilla.org/ru/docs/Web/JavaScri...
https://developer.mozilla.org/ru/docs/Web/JavaScri...
https://developer.mozilla.org/ru/docs/Web/JavaScri...
Ответ написан
@Karpion
Я так понял, массив отсортирован. Значит, надо проверить, входит ли исходное число в диапазон "от меньшего до большего элемента массива". Если входит - то искать методом половинного деления (Дональд Кнут "Сортировка и поиск"; или Никлаус Вирт "Алгоритмы и структуры данных").

Найдя - проверить/сравнить найденный элемент и предшествующий/последующий (смотря как искать будете). Выбирайте, какой Вам больше нравится.

А можно тупо перебрать все элементы массива и выбрать наилучший.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
const arrayNumbers = [-5, 0, 5, 10, 15, 20, 25, 30, 35]
const n = 23.45
const bestMatch = arrayNumbers.reduce(searchClosestNum, {delta: Infinity, value: null})
const res = bestMatch.value
console.log(bestMatch)

function searchClosestNum(acc, val) {
  const delta = Math.abs(val - n)
  if (delta < acc.delta) {
    acc.delta = delta
    acc.value = val
  }
  return acc
}

Ответ написан
Комментировать
@Arik
?
const arrayNumbers = [-5, 0, 5, 10, 15, 20, 25, 30, 35]
const n = 23.45
const buf = arrayNumbers.map(number => { return Math.abs(n - number); });
const res = arrayNumbers[buf.indexOf(Math.min(...buf))];

console.log(res);
Ответ написан
boompro
@boompro
Frontend dev
Согласен, классно ребята, но у парня проблема простого алгоритма, а некоторые из вас даете решение с map, reduce, spread он пол дня будет еще разбираться как это оно работает. Может проще надо для начала? Жду критики.

const neigborMin = (n, arr) => {
    let min = n
    let index = 0
    for (let i = 0; i < arr.length; i++) {
        if (Math.abs(n - arr[i]) <= min) {
            min = Math.abs(n - arr[i])
            index = i
        }
    }
    return arr[index]
}
const array = [-5, 0, 5, 10, 15, 20, 25, 30, 35]
let res = null
res = neigborMin(11.38, array)
console.log('result 1: ', res)
res = neigborMin(23.45, array)
console.log('result 2: ', res)
res = neigborMin(0, array)
console.log('result 3: ', res)
res = neigborMin(-5.10, array)
console.log('result 4: ', res)
res = neigborMin(5.10, array)
console.log('result 5: ', res)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы