 
			
				17.02.2020, 18:31
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 12.08.2015 
					
					
					
						Сообщений: 206
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Как округлить число?
			 
			
		
		
		
		Всем привет. Ребята, подскажите, как решить задачу. 
У меня, к примеру, есть массив цифр:
 
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 (число из массива).  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.02.2020, 19:44
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.12.2012 
					
					
					
						Сообщений: 3,841
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
(() => {
    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}`);
})();
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Nexus, 17.02.2020 в 19:58.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.02.2020, 20:38
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				массив поиск ближайшего
			 
			
		
		
		
		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)));
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось рони, 17.02.2020 в 20:53.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				17.02.2020, 20:59
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				18.02.2020, 00:04
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.10.2016 
					
					
					
						Сообщений: 1,013
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		ежели массив отсортированный, и при этом большой, то лучше бинарный поиск 
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'))
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				18.02.2020, 14:03
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.12.2012 
					
					
					
						Сообщений: 3,841
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 рони, не срача ради, а интереса для 
Зачем писать трудночитаемый код, как в посте №3? 
Я про функцию в одну строку, разумеется. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				18.02.2020, 15:07
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Nexus
			
		
	 | 
 
	| 
		трудночитаемый
	 | 
 
	
 
    
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)));
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				18.02.2020, 17:42
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.12.2012 
					
					
					
						Сообщений: 3,841
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 рони, это не тот ответ, к сожалению, на который я рассчитывал. 
"Развернуть" код я и сам мог, вопрос в том, почему его не сразу писать таким, как в посте №7? 
 
Можете проигнорировать вопрос. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				18.02.2020, 18:00
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Nexus
			
		
	 | 
 
	| 
		почему его не сразу писать таким
	 | 
 
	
 
 код утратил лаконичность, в этом и была задумка, плюс показать, что есть альтернатива методу  reduce 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.02.2020, 12:53
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.12.2012 
					
					
					
						Сообщений: 3,841
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 рони, спасибо. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |