【问题标题】:code always returning NAN代码总是返回 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 怎么办? (是的,用户可能是这个愚蠢的)。

标签: javascript


【解决方案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)。您需要检查它在哪一步返回字符串而不是数字

      【讨论】:

        猜你喜欢
        • 2012-04-28
        • 2014-11-16
        • 1970-01-01
        • 2021-09-18
        • 2012-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多