2015-10-27 6 views
2

Выполнение проекта для моего вступления в класс javascript и не может понять, почему это не работает. Может кто-нибудь мне помочь? Вот мой код для задания.Почему я получаю сообщение об ошибке javascript NaN?

//Declare variables 
var guestsPerRoom; 
var discount; 
var goodView; 
var totalCost; 
var costPerNight; 
var membership; 

//prompt user to enter info based on their needs 
guestsPerRoom = prompt("How many guests will be staying in this room? (Max 6)"); 
discount = prompt("Are you a member of AAA?"); 
goodView = prompt("Would you like a room with a good view? (10% Price Increase)"); 

//Calculate guests needs to total cost 
totalCost = Number(totalCost); 
discount = Number(discount); 
costPerNight = Number(costPerNight); 

//Output users total cost 
if (guestsPerRoom === 1 || guestsPerRoom === 2) { 
    costPerNight = 50; 
    if (membership === 'Y') { 
    discount = costPerNight * 0.85; 
    } 
    else if (membership === 'N') { 
    discount = costPerNight; 
    } 
    if (goodView === 'Y') { 
    totalCost = costPerNight * discount * 1.1;‹ 
    } 
    else if (goodView === 'N') { 
    totalCost = costPerNight * discount; 
    } 
} 
document.write("Total cost per night is $" + totalCost); 

Когда я запускаю программу, я надеюсь получить фразу «Общая стоимость за ночь составляет $ 50 (или что-то общая стоимость будет). Может ли кто-нибудь сказать мне, что я делаю неправильно? Я полагаю, что моя переменная TotalCost не определена, но я не могу понять это.

+2

Какая ошибка вы видите? Пожалуйста, включите весь текст. – bdesham

+2

Что такое символ '<' в строке 'totalCost = costPerNight * discount * 1.1; <'? –

+0

инициализируйте переменные, вы также должны проверить после ввода, если значение было числом while (isNaN (переменная)) {ask again} – Vince

ответ

2

похоже

discount = prompt("Are you a member of AAA?"); 

Должно быть

membership = prompt("Are you a member of AAA?"); 

поскольку у вас есть

if (membership === 'Y') { 

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

discount = Number(discount); 
+0

Я бы удалил все эти строки 'Number (...)'. Они не делают ничего полезного. – cHao

4

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

discount = prompt("Are you a member of AAA?"); 
goodView = prompt("Would you like a room with a good view? (10% Price Increase)"); 

discount = Number(discount); 
costPerNight = Number(costPerNight); 

Конечно эти ответы не являются числами , Отсюда и ошибка.

+1

'costPerNight' не является результатом второго вопроса, а' discount' является, но не должен быть результатом первого. – GolezTrol

1

Есть пара проблем с этим кодом. Прежде всего, guestsPerRoom получает строковое значение из приглашения, поэтому оператор triple === 'strict' не будет работать, если вы сравните его с числом. Вы либо должны убедиться, что они одного типа (как строки, так и обоих), или используйте нестандартное сравнение ==.

Тогда membership никогда не получает значение до того, как вы начнете его использовать в ifs, так как вы сохраняете результат запроса внутри discount.

Кроме того, totalCost = Number(totalCost) приведет к тому, что totalCost станет NaN, так как вы не дали ему значение раньше. Так как другие переменные также не имеют или неверных или неожиданных значений, ваше дерево if никогда не вводится, а totalCost никогда не получает другое значение, чем NaN, которое оно первоначально было получено. Вот почему вы видите NaN на выходе.

Подсказка: используйте console.log(totalCost) для проверки totalCost (и то же самое для других переменных, конечно). Вы можете использовать пару строк в коде, чтобы эти значения выводились на консоль (нажмите F12, чтобы открыть его). Таким образом, вы можете проверять значения и путь к коду без блокировки выполнения. Вы также можете использовать отладчик для выполнения кода, но это немного сложнее освоить.

0

Вы должны проверить свой ввод как число, так как вы используете «===», который заботится о типе var, поэтому вы хотите убедиться, что вы проверяете ввод пользователя. любой ввод текста или «странный» ввод приведет к типу «NaN».

1

Значение, возвращаемое с prompt, является строкой (или null, если отменено), поэтому, когда вы пытаетесь сравнить значение с числом, используя ===, оно не будет соответствовать.

Вы можете использовать оператор ==, чтобы сделать тип расслабленного сравнения, но лучше обрабатывать числа как цифры, а не строки. Разбираем значение числа, то в любом случае сравнивать их будет работать:

guestsPerRoom = parseInt(prompt("How many guests will be staying in this room? (Max 6)"), 10); 

присваивается результат от членства вопрос переменной discount, она должна быть:

membership = prompt("Are you a member of AAA?"); 

В следующем несколько строк вы преобразуете значения в totalCost, discount и costPerNight в номера, хотя вы им еще ничего не присвоили (кроме скидок, которым было присвоено значение принадлежности).

При установке значения discount вы используете costPerNight, но позже умножить это значение с costPerNight так, что бы общей стоимостью квадрата costPerNight. Просто присвойте коэффициент дисконтирования переменной:

if (membership === 'Y') { 
    discount = 0.85; 
} 
else if (membership === 'N') { 
    discount = 1.0; 
} 
+0

Это очень помогло, спасибо! – Danny