代码总是返回 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 没有写。

【问题讨论】:

好吧,discountcdiscountediscountaNaN 你不应该那样比较,先转换成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的主要内容,如果未能解决你的问题,请参考以下文章

尝试将数据库中的整数添加到 let 但总是返回 NaN

parseInt 总是返回 NaN?

我使用flex 通过RemoteObject与java交互,java访问SQL Server2005,但是总是返回NaN。

为啥 [NaN].includes(NaN) 在 JavaScript 中返回 true?

c ++函数在返回时将浮点值转换为NaN

在我的自定义函数中返回 double.NaN:这是一个好习惯吗?