代码总是返回 NAN
Posted
技术标签:
【中文标题】代码总是返回 NAN【英文标题】:code always returning NAN 【发布时间】:2013-07-11 23:11:02 【问题描述】:我目前正在学习编码课程,我们正在使用 JS。我的代码很好,但我遗漏了一些东西,因为对于折扣输出,我总是得到 NAN。有谁知道为什么会这样?
//Input
var orderAmount = prompt("What is the order amount?");
var contractor = prompt("Are you a contractor? yes/no?");
var employee = prompt("Are you an employee? yes/no?");
var age = prompt("How old are you?");
//Constant
var employeeDisc = .10;
var largeOrderDisc = .05;
var contractorDisc = .20;
var taxRate = .08;
var noTax = 0;
//Calculations
if (orderAmount >= 800)
var discounta = orderAmount * largeOrderdisc;
else
var discounta = 0;
if (contractor == "yes")
var discountc = orderAmount * contractorDisc;
else if(contractor == "no")
var discountc = 0;
if(employee == "yes")
var discounte = orderAmount * employeeDisc;
else if(emplyee == "no")
var discounte = 0;
var discount = discountc + discounte + discounta;
var subtotal = orderAmount - discount;
if (age >= 90)
tax = subtotal * noTax;
else
tax = subtotal * taxRate;
total = subtotal - tax;
//Output
document.write("Original Price: $" + orderAmount);
document.write("Discount: $" + discount);
document.write("Subtotal: $" + orderAmount);
document.write("Tax: $" + tax);
document.write("Final Price: $" + total);
document.write("Final Price: $" + total);
抱歉,代码无法编译。现在已修复。现在的问题是我的 document.write 没有写。
【问题讨论】:
好吧,discountc
、discounte
或 discounta
是 NaN
。
你不应该那样比较,先转换成int:"15" > "10" -> true; "15" > "9" -> false
请发布工作代码(当前代码甚至无法编译)并提供一个小提琴以获得更多有用的答案。
以上所有内容的补充:if (contractor == "yes") else if (contractor == "no")
- 如果用户在提示框中输入fgsfds
怎么办? (是的,用户可能是这个愚蠢的)。
【参考方案1】:
您的 else 语句现在不正确,因此代码根本无法运行。删除 (contractor == "no")
之类的表达式
这是一个显示它工作的小提琴。 http://jsfiddle.net/bitfiddler/6fYvd/
【讨论】:
【参考方案2】:您正在尝试使用字符串执行算术计算和比较。 NaN
是“Not A Number”,它是算术运算失败的数值结果(例如除以零,或对 NaN 的任何计算)。
注意下面使用的是数字,而不是字符串:
var employeeDisc = .10;
var largeOrderDisc = .05;
var contractorDisc = .20;
var taxRate = .08;
var noTax = 0;
//Calculations
if (orderAmount >= 800)
var discounta = orderAmount * largeOrderdisc;
else
var discounta = 0;
此外,
prompt()
将返回一个字符串。在执行计算之前,您应该将其转换为数字。您可能想使用parseInt()
或parseFloat()
。
这是一个产生NaN
的简单示例:
var x = 'x5';
var y = '2';
var difference = x - y;
console.log( difference ); // Note: you can use console.log() to write messages to the console in your browser's developer tools. It is handy for debugging.
【讨论】:
似乎JS实际上会在这里将输入转换为数字。'5'*'2' -> 10
'5'+'2' == '52',所以不要依赖它。
这里 - 是的,但这不会产生NaN
javascript 确实有类型强制,但我避免使用它。我不喜欢通常由类型强制导致的意外结果。【参考方案3】:
虽然您确实应该使用数字变量,但 JavaScript 会根据需要转换值。我测试了你的代码,真正的问题是这两行:
else (contractor == "no")
和
else (emplyee == "no")
这些应该是
else if(contractor == "no")
和
else if(emplyee == "no")
脚本甚至不会像发布的那样编译,所以我不知道你是如何得到 NaN 的。
【讨论】:
【参考方案4】:这是因为您在 if 子句中声明了折扣变量。在 if 子句之外定义它们,那么你就没有问题了。
var discounta;
if (a > b)
discounta = 0.1;
else
discounta = 0.2;
同时检查 javascript 的变量范围。
【讨论】:
实际上,JavaScript 在这方面不像 C 或 Java。只有函数会创建新范围。尽管如此,出于可读性考虑,我同意您的建议。【参考方案5】:在 Javascript 中,每当您尝试对不是数字的数据进行数学运算时,都会返回 NaN(Not a Number)。您需要检查它在哪一步返回字符串而不是数字
【讨论】:
以上是关于代码总是返回 NAN的主要内容,如果未能解决你的问题,请参考以下文章
我使用flex 通过RemoteObject与java交互,java访问SQL Server2005,但是总是返回NaN。