结果我在最后一个函数中的一个数字旁边得到了 NaN

Posted

技术标签:

【中文标题】结果我在最后一个函数中的一个数字旁边得到了 NaN【英文标题】:i'm getting NaN as a result beside a number in the last function 【发布时间】:2020-06-13 13:35:24 【问题描述】:
var john  = 
name: 'John Smith',
bills: [124,48,268,180,42],
tips : [],
final: [],
calcTips: function()
    for(i = 0; i < this.bills.length;i++)
        if(this.bills[i] < 50)
            this.tips[i] = this.bills[i] * 0.2;
            this.final[i] = this.bills[i] + this.tips[i];
         else if(this.bills[i] >= 50 && this.bills[i] <= 200)
            this.tips[i] = this.bills[i] * 0.15;
            this.final[i] = this.bills[i] + this.tips[i];
         else
            this.tips[i] = this.bills[i] * 0.1;
            this.final[i] = this.bills[i] + this.tips[i];
        
    

;

var mark  = 
name: 'Mark Smith',
bills: [77,375,110,45],
tips : [],
final: [],
calcTips: function()
    for(i = 0; i < this.bills.length;i++)
        if(this.bills[i] < 100)
            this.tips[i] = this.bills[i] * 0.2;
            this.final[i] = this.bills[i] + this.tips[i];
         else if(this.bills[i] >= 100 && this.bills[i] <= 300)
            this.tips[i] = this.bills[i] * 0.1;
            this.final[i] = this.bills[i] + this.tips[i];
         else
            this.tips[i] = this.bills[i] * 0.25;
            this.final[i] = this.bills[i] + this.tips[i];
        
    

;

function calcAverage(tips)
var sum = 0;
for(i = 0; i < tips.length ; i++)
    sum = tips[i] + sum;

return sum / tips.length;

mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);
mark.calcTips();
john.calcTips();
console.log(john);
console.log(mark);

函数 calcAverage 在平均值之外返回 NaN。 我对其进行了编码,因此它将循环提示数组并将提示加上总和添加到 sum 变量中。 有人能解释一下这个问题吗?

【问题讨论】:

tips.length == 0,你会得到0 / 0,这确实是NaN 【参考方案1】:

据我所知,平均小费是在小费实际存在之前计算的。如果你移动上面提示的计算,它应该可以正常工作:

mark.calcTips();
john.calcTips();
mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);
console.log(john);
console.log(mark);

【讨论】:

【参考方案2】:

尝试调用这些函数

mark.calcTips(); john.calcTips();

之前

mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);

因为调用 calcAverage() 函数时提示是空数组

代码应该是

mark.calcTips();
john.calcTips(); 
mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);

【讨论】:

【参考方案3】:

当您调用该函数时,问题围绕着“this”绑定。你可以看到calcTips 是使用apply() 调用的,但是我只是出于演示目的提取了该函数;这段代码仍然可以改进,但没有太大改变,所以你可以看看会发生什么;

查看代码sn-p:

var john = 
  name: "John Smith",
  bills: [124, 48, 268, 180, 42],
  tips: [],
  final: []
;

var mark = 
  name: "Mark Smith",
  bills: [77, 375, 110, 45],
  tips: [],
  final: []
;

function calcTips() 
  for (let i = 0; i < this.bills.length; i++) 
    if (this.bills[i] < 100) 
      this.tips[i] = this.bills[i] * 0.2;
      this.final[i] = this.bills[i] + this.tips[i];
     else if (this.bills[i] >= 100 && this.bills[i] <= 300) 
      this.tips[i] = this.bills[i] * 0.1;
      this.final[i] = this.bills[i] + this.tips[i];
     else 
      this.tips[i] = this.bills[i] * 0.25;
      this.final[i] = this.bills[i] + this.tips[i];
    
  


function calcAverage(tips) 
  var sum = 0;
  for (i = 0; i < tips.length; i++) 
    sum = tips[i] + sum;
  
  return sum / tips.length;


//calling calcTips with "this" refers to mark 
calcTips.apply(mark);

//calling calcTips with "this" refers to john 
calcTips.apply(john);

mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);
console.log(john);
console.log(mark);

【讨论】:

【参考方案4】:

你在调用calcAverage之前调用calcTips,所以数组是空的。 calcAveragereturn sum / tips.length 结尾。因为sum0tips.length0,那就是NaN(在javascript 中,0/0NaN,因为JavaScript 使用IEEE 754 双精度浮点数,它指定了这种行为)。

修复它:

    tips.length0 时不要划分sum,并且 在计算平均值之前先计算小费。

【讨论】:

你最后的说法是错误的。试试console.log(1.0 / 0);。在 C/C++ BTW 中也是错误的,并且可能在浮点格式支持 +inf-inf 的其他语言中也是错误的。 非常感谢。不敢相信我犯了这种错误:P 即使1 / 0 也不会返回NaN(尽管在类型化语言中不会出现这种情况)。 console.log(typeof (50 / 0)); // -&gt; number 无穷大是一个数字 @goodvibration - 谢谢!修复。这就是我快速发帖并去吃晚饭的结果。是0 / 0`(OP 正在做的)导致NaNx / 0 其中x 不是NaN0 导致Infinity-Infinity。请注意,这与 JavaScript 的松散类型没有任何关系。 NaNInfinity等都是number类型(IEEE-754双精度浮点)。这完全符合 IEEE 754-2019 规范。

以上是关于结果我在最后一个函数中的一个数字旁边得到了 NaN的主要内容,如果未能解决你的问题,请参考以下文章

如何在Python中搜索Numpy数组中的数字

Python:排序函数在存在 nan 时中断

js中的三大特殊数据:undefined,null,NaN及逻辑分支(选择结构,分支结构)

getAircraftLocation() - 获取Android中Lat / Lng的“NaN”(非数字)

js数据类型

React Redux 在映射状态后获取 NaN