Почему моя программа считает, что 72 больше, чем 500?

Я пытаюсь создать программу, которая берет у пользователя три числа и дает им наибольшее и наименьшее, но иногда числа переворачиваются (самое большое переключается с наименьшим), а иногда некоторые числа просто не учитываются. Кто-нибудь может сказать мне, что происходит?

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}.`);

Каким-то образом числа переворачиваются или некоторые числа не учитываются.

Подсказка: вам нужно преобразовать эти предоставленные пользователем строки в числа, прежде чем выполнять сравнение.

Trash Can 18.12.2020 03:38

Потому что '7' > '5'

Robby Cornelissen 18.12.2020 03:38

@RobbyCornelissen, вы наверняка знаете обманщика, с которым вы можете закрыть это ...

Nick 18.12.2020 03:44

Это не отсортировано численно, это отсортировано ASCIIabetical. 1, 11, 111, 2, 21, 22, 222 считается отсортированным.

tadman 18.12.2020 03:47

@Ник, я не думаю, что это обман. Вопрос не в том, как превратить строку в число. Он спрашивает о неизвестной ошибке в определенном блоке кода.

ElectricShadow 18.12.2020 03:48

@ElectricShadow Он спрашивает, почему сравнение числовых строк не работает должным образом.

Nick 18.12.2020 03:50

даже не читая ваш код, я могу сказать вам, что он сортирует ваши числа по алфавиту.

Rick 18.12.2020 06:28

Отвечает ли это на ваш вопрос? Как правильно отсортировать массив целых чисел

Nick 18.12.2020 12:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
8
112
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужно преобразовать числа в целые числа или числа с плавающей запятой.

Используйте 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)

slebetman 18.12.2020 04:12

Большое спасибо за помощь, я потратил 3 часа, пытаясь понять это. Я только начинаю программировать и иногда чувствую себя очень глупо, делая такие вещи, так что спасибо!

TheFishManJS 18.12.2020 14:41

Исправление здесь заключается в том, чтобы не только конвертировать, но и сортировать:

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?

Потому что -

  1. Вы сравниваете строки "72" и "500", а не числа 72 и 500
  2. С точки зрения сравнения строк "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`)),
];

Другие вопросы по теме