Javascript-对数组中的值取平均值不正确?

时间:2019-03-11 04:44:42

标签: javascript arrays

所以我正在尝试编码练习,但似乎找不到问题。我需要从数组中提取中位数。如果数组是偶数长度,则需要两个值的平均值。

const N = parseInt(readline());
var inputs = readline().split(' ');
for (let i = 0; i < N; i++) {
    const X = parseInt(inputs[i]);
}

var arr = inputs.sort((a, b) => a - b);
if (arr.length % 2 === 0)
{
    console.error(arr);
    console.error(arr[arr.length / 2 - 1]);
    console.error(arr[arr.length / 2]);
    var a = arr[arr.length / 2 - 1];
    var b = arr[arr.length / 2];
    var ans = (a + b) / 2;
    console.log(ans);
}
else console.log(arr[Math.floor(arr.length/2)]);

控制台输出: ['1','2','3','4','5','6','7','8','9','10'] 5 6 28

因此,从控制台输出中,我的数组已正确排序。接下来,我正确地提取了两个中位数。我的 a 确实是5,而我的 b 确实是6。但是将它们加上(a + b)/ 2突然变成28 ...为什么?

3 个答案:

答案 0 :(得分:3)

变量var ans = (parseInt(a, 10) + parseInt(b, 10)) / 2; a被当作字符串并连接在一起,然后进行除法:b + '5'变成'6'并将它们除以{ {1}}产生56。因此,在进行加法之前,您需要将它们强制为数字:

2

在变量之前加上算术运算符,以将它们强制转换为数字,然后可以将其添加。

答案 1 :(得分:2)

花花公子您要添加两个字符串,即'5'+'6',这使其等于56除以2 = 28(是的,JS很疯狂)。只需使用parseInt,

sudo tns create Tekmo --template tns-template-hello-world

答案 2 :(得分:0)

似乎您正在将字符串加在一起。它实际上是采用charCode而不是Number值,例如:'1'.charCodeAt(0)

我通过在输入数组上使用.map解决了这个问题:

const N = parseInt(readline());
var inputs = readline().split(' ').map(function(num) { return parseInt(num); });

var arr = inputs.sort((a, b) => a - b);
if (arr.length % 2 === 0)
{
    console.error(arr);
    console.error(arr[arr.length / 2 - 1]);
    console.error(arr[arr.length / 2]);
    var a = arr[arr.length / 2 - 1];
    var b = arr[arr.length / 2];
    var ans = (a + b) / 2;
    console.log(ans);
}
else console.log(arr[Math.floor(arr.length/2)]);