Я пытаюсь создать программу, которая берет у пользователя три числа и дает им наибольшее и наименьшее, но иногда числа переворачиваются (самое большое переключается с наименьшим), а иногда некоторые числа просто не учитываются. Кто-нибудь может сказать мне, что происходит?
const testArray = [
prompt(`Pick a number`),
prompt(`Pick a number`),
prompt(`Pick a number`),
];
let max = testArray[0];
let min = testArray[0];
for (let i = 1; i < testArray.length; i++) {
if (testArray[i] > max) max = testArray[i];
if (testArray[i] < min) min = testArray[i];
}
console.info(`The biggest number you chose was ${max}`);
console.info(`The smallest number you chose was ${min}.`);Каким-то образом числа переворачиваются или некоторые числа не учитываются.
Потому что '7' > '5'
@RobbyCornelissen, вы наверняка знаете обманщика, с которым вы можете закрыть это ...
Это не отсортировано численно, это отсортировано ASCIIabetical. 1, 11, 111, 2, 21, 22, 222 считается отсортированным.
@Ник, я не думаю, что это обман. Вопрос не в том, как превратить строку в число. Он спрашивает о неизвестной ошибке в определенном блоке кода.
@ElectricShadow Он спрашивает, почему сравнение числовых строк не работает должным образом.
даже не читая ваш код, я могу сказать вам, что он сортирует ваши числа по алфавиту.
Отвечает ли это на ваш вопрос? Как правильно отсортировать массив целых чисел



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно преобразовать числа в целые числа или числа с плавающей запятой.
Используйте parseInt() для преобразования в целые числа или используйте parseFloat() для преобразования в значения с плавающей запятой.
let testArray = [
parseInt(prompt(`Pick a number`)),
parseInt(prompt(`Pick a number`)),
parseInt(prompt(`Pick a number`))
];
let max = testArray[0];
let min = testArray[0];
for (let i = 1; i < testArray.length; ++i) {
if (testArray[i] > max) max = testArray[i];
if (testArray[i] < min) min = testArray[i];
}
alert(`The biggest number you chose was ${max}, and the smallest was ${min}.`);
// console.info(testArray.length);
console.info(min, max);Если вы не можете контролировать, что будут вводить пользователи, вы всегда должны использовать второй аргумент для parseInt -- parseInt(prompt('..'), 10)
Большое спасибо за помощь, я потратил 3 часа, пытаясь понять это. Я только начинаю программировать и иногда чувствую себя очень глупо, делая такие вещи, так что спасибо!
Исправление здесь заключается в том, чтобы не только конвертировать, но и сортировать:
let sorted = testArray.map(v => parseInt(v, 10)).sort((a,b) => a-b);
let min = sorted[0];
let max = sorted[sorted.length - 1];
Почему ваша программа считает, что 72 больше, чем 500?
Потому что -
"72" и "500", а не числа 72 и 500Вы можете проверить это с помощью следующего кода -
// user inputs - 72, 123, 500
console.info(testArray); // output: ["72", "123", "500"]
console.info("72">"500"); // output: true
Как это произошло?
Ввод данных пользователем с помощью prompt() всегда читается как строки.
Как это исправить?
Как уже упоминалось, перед сравнением вы должны преобразовать строки в числа. Вы можете сделать это, принимая входные данные, например -
const testArray = [
Number(prompt(`Pick a number`)),
Number(prompt(`Pick a number`)),
Number(prompt(`Pick a number`)),
];
Подсказка: вам нужно преобразовать эти предоставленные пользователем строки в числа, прежде чем выполнять сравнение.