Как округлить число?
Всем привет. Ребята, подскажите, как решить задачу.
У меня, к примеру, есть массив цифр: 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 (число из массива). |
(() => { const arrayNumbers = [-5, 0, 5, 10, 15, 20, 25, 30, 35]; const n = 23.45 const res = arrayNumbers[arrayNumbers.reduce(function (res, value, index) { return (value = Math.abs(n - value)) < res.value ? {index, value} : res; }, {index: null, value: Infinity}).index]; alert(res); })(); upd. (() => { const n = prompt('Enter the number', 11.38) || 23.45; const arrayNumbers = [-5, 0, 5, 10, 15, 20, 25, 30, 35]; const res = arrayNumbers[arrayNumbers.reduce(function (res, distance, index) { return (distance = Math.abs(n - distance)) < res.distance ? {index, distance} : res; }, {index: 0, distance: Infinity}).index]; alert(`n = ${n}; res = ${res}`); })(); |
массив поиск ближайшего
s24344,
:) const arrayNumbers = [-5, 0, 5, 10, 15, 20, 25, 30, 35]; const n = 23.45; const k = 11.38; const res = (a, b, c) => (b = a.map(a => Math.abs(a - b)), c = Math.min(...b), b = b.findIndex(a => a === c), a[b]); const fn = res.bind("",arrayNumbers); alert(JSON.stringify([n, k].map(fn))); |
|
ежели массив отсортированный, и при этом большой, то лучше бинарный поиск
function binSearch(arr, x) { if (!arr || !arr.length || arr[arr.length - 1] < x) return arr ? arr.length : 0; var b = 0, e = arr.length; while (e > b) { var idx = Math.floor((b + e) / 2); if (arr[idx] < x) b = idx + 1; else e = idx; } return e; } function round(n, nums) { var pos = binSearch(nums, n); if (pos === nums.length) return nums[nums.length - 1]; if (pos === 0) return nums[0]; return n - nums[pos - 1] < nums[pos] - n ? nums[pos - 1] : nums[pos]; } // ----------------- var arrayNumbers = [-5, 0, 5, 10, 15, 20, 25, 30, 35]; alert([-7, 6, 11, 28, 60].map(v => v + ' -> ' + round(v, arrayNumbers)).join('\n')) |
рони, не срача ради, а интереса для
Зачем писать трудночитаемый код, как в посте №3? Я про функцию в одну строку, разумеется. |
Цитата:
const arrayNumbers = [-5, 0, 5, 10, 15, 20, 25, 30, 35]; const n = 23.45; const k = 11.38; /*const res = (a, b, c) => (b = a.map(a => Math.abs(a - b)), c = Math.min(...b), b = b.findIndex(a => a === c), a[b]);*/ const search = (array, number) => { const arrayAbs = array.map(value => Math.abs(value - number)); const minArrayAbs = Math.min(...arrayAbs); const indexMinArrayAbs = arrayAbs.findIndex(value => value === minArrayAbs); return array[indexMinArrayAbs] } /*const fn = res.bind("",arrayNumbers);*/ const fn = search.bind("",arrayNumbers); alert(JSON.stringify([n, k].map(fn))); |
рони, это не тот ответ, к сожалению, на который я рассчитывал.
"Развернуть" код я и сам мог, вопрос в том, почему его не сразу писать таким, как в посте №7? Можете проигнорировать вопрос. |
Цитата:
|
рони, спасибо.
|
Часовой пояс GMT +3, время: 05:51. |