Как я могу исправить ошибку 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>
AFAIK, вы должны использовать точку в качестве десятичной точки, а не запятую
Также для логического «И» это &&
, а не &
. Реальный ответ на ваш вопрос заключается в том, что вы должны зайти в отладчик и выяснить, что содержат эти локальные переменные.
Когда n1
изменяется, но в n2
еще ничего не введено, вы получаете NaN
, потому что n2
нет, а n1 + NaN
есть NaN
.
После получения текущих значений я бы добавил if (isNaN(n1 + n2 + ex)) return;
, потому что нет смысла в остальной части функции, если значения неполные.
как получить NaN
?
Ребята, я сделал указанные вами настройки, но ошибка осталась. Я понял, что написал Пойнти, но не смог применить решение, основанное на этом. Я буду продолжать пытаться.
@TachibanaShin, parseFloat
чего-то, что не анализируется как число, даст NaN. пример: parseFloat('a')
.
Когда вы получаете ошибку? Вы вводите что-нибудь для n1, n2 и ex? Ваш код работает нормально (NaN, только если соответствующие входные данные пусты) в этой тестовой скрипте.
@Wyck Я хочу знать, как воспроизвести молнию
@TmTron, хорошее замечание по поводу запятой. По замыслу он анализирует все, что может иметь смысл в начале, и просто останавливается на запятой, поэтому parseFloat('0,5')
— это 0
, а parseFloat(',5')
— это NaN
. См. этот ответ, чтобы узнать, как parseFloat
использовать запятые в качестве разделителей тысяч или десятичных разделителей.
Привет, это сработало! Я последовал совету Татибаны Шин, но внес одно изменение. Выглядело это так: value.replace('', '0');
Спасибо! <3
на основе воспроизведения ошибки @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));
}
}
Пожалуйста, добавьте некоторое объяснение к вашему ответу, чтобы другие могли извлечь из него уроки. Что вы изменили и почему?
попробуйте установить переменную
NotaFinal
на что-то другое, так как она конфликтует с именем вашей функции.