Результат вычисления, приводящий к NaN

Как я могу исправить ошибку NaN в приведенном ниже коде?

Я уже пытался инициализировать переменные с 0, но это не сработало.

Игнорируйте CSS внутри тегов, где работа должна быть написана вот так...

Это код.

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset = "UTF-8">
        <script type = "text/javascript">
            function NotaFinal() {
                var n1 = parseFloat(document.getElementById("n1").value);
                var n2 = parseFloat(document.getElementById("n2").value);
                var ex = parseFloat(document.getElementById("ex").value);
                var MediaFinal = n1 + n2;
    
                if (ex > 0) {
                    if (MediaFinal > 2.75 && MediaFinal < 5.75) {
                    MediaFinal = (MediaFinal + (ex*2)) / 3
                    alert("A nota final é " + MediaFinal.toFixed(1));
                    }
                } else {
                    alert("A nota final é " + MediaFinal.toFixed(1));
                }
            }
    
            function Limpar() {
                document.getElementById("n1").value = "";
                document.getElementById("n2").value = "";
                document.getElementById("ex").value = "";
            }
            
        </script>
    </head>
    <body>
        <strong><span style = "padding-top: 10px; font-family: Arial, Helvetica, sans-serif;">N1</span></strong><input id = "n1" type = "number"><br><br>
        <strong><span style = "padding-top: 10px; font-family: Arial, Helvetica, sans-serif;">N2</span></strong><input id = "n2" type = "number"><br><br>
        <strong><span style = "padding-top: 10px; font-family: Arial, Helvetica, sans-serif;">EX</span></strong><input id = "ex" type = "number"><br><br>
    
        <button onclick = "NotaFinal()" style = "background-color: #0C5BA1; color: #FFFFFF; border: none; padding: 2px; width:70px; margin-left: 23px;">Calcular</button>
        <button onclick = "Limpar()" style = "background-color: #0C5BA1; color: #FFFFFF; border: none; padding: 2px; width: 70px; margin-left: 20px;">Limpar</button>
    
    </body>
    </html>

попробуйте установить переменную NotaFinal на что-то другое, так как она конфликтует с именем вашей функции.

EpicPuppy613 06.02.2023 16:54

AFAIK, вы должны использовать точку в качестве десятичной точки, а не запятую

TmTron 06.02.2023 16:55

Также для логического «И» это &&, а не &. Реальный ответ на ваш вопрос заключается в том, что вы должны зайти в отладчик и выяснить, что содержат эти локальные переменные.

Pointy 06.02.2023 16:58

Когда n1 изменяется, но в n2 еще ничего не введено, вы получаете NaN, потому что n2 нет, а n1 + NaN есть NaN.

Pointy 06.02.2023 17:00

После получения текущих значений я бы добавил if (isNaN(n1 + n2 + ex)) return;, потому что нет смысла в остальной части функции, если значения неполные.

Pointy 06.02.2023 17:02

как получить NaN?

Tachibana Shin 06.02.2023 17:34

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

Nícolas Nascimento 06.02.2023 19:14

@TachibanaShin, parseFloat чего-то, что не анализируется как число, даст NaN. пример: parseFloat('a').

Wyck 06.02.2023 19:51

Когда вы получаете ошибку? Вы вводите что-нибудь для n1, n2 и ex? Ваш код работает нормально (NaN, только если соответствующие входные данные пусты) в этой тестовой скрипте.

FiddlingAway 06.02.2023 20:52

@Wyck Я хочу знать, как воспроизвести молнию

Tachibana Shin 06.02.2023 20:59

@TmTron, хорошее замечание по поводу запятой. По замыслу он анализирует все, что может иметь смысл в начале, и просто останавливается на запятой, поэтому parseFloat('0,5') — это 0, а parseFloat(',5') — это NaN. См. этот ответ, чтобы узнать, как parseFloat использовать запятые в качестве разделителей тысяч или десятичных разделителей.

Wyck 06.02.2023 22:11

Привет, это сработало! Я последовал совету Татибаны Шин, но внес одно изменение. Выглядело это так: value.replace('', '0'); Спасибо! <3

Nícolas Nascimento 07.02.2023 21:23
Поведение ключевого слова "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) для оценки ваших знаний,...
1
12
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

на основе воспроизведения ошибки @wck:

Как видите (1), (2), (3) я добавил .replace(',', '.') to replace the first ,found with a dot.according to the standard about type of programming language if there are two signs,`, тогда это уже не число и будет возвращаться NaN

function NotaFinal() {
  var n1 = parseFloat(document.getElementById("n1").value.replace(',', '.')); // (1)
  var n2 = parseFloat(document.getElementById("n2").value.replace(',', '.')); // (2)
  var ex = parseFloat(document.getElementById("ex").value.replace(',', '.')); // (3)
  var MediaFinal = n1 + n2;
    
  if (ex > 0) {
    if (MediaFinal > 2.75 && MediaFinal < 5.75) {
      MediaFinal = (MediaFinal + (ex*2)) / 3
      alert("A nota final é " + MediaFinal.toFixed(1));
    }
  } else {
    alert("A nota final é " + MediaFinal.toFixed(1));
  }
}

Пожалуйста, добавьте некоторое объяснение к вашему ответу, чтобы другие могли извлечь из него уроки. Что вы изменили и почему?

Nico Haase 07.02.2023 08:38

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