简体   繁体   English

的JavaScript。 Math.sqrt给NaN一个正数?

[英]Javascript. Math.sqrt giving NaN to a positive number?

I currently have a script that takes numbers from a text area and does all sorts of calculations with them. 我目前有一个脚本,该脚本从文本区域获取数字并使用它们进行各种计算。 I am having trouble with my standard deviation function because it will not output the value even though it's type is number, and it is positive (.56). 我在使用我的标准偏差函数时遇到了麻烦,因为即使它的类型是数字,也不会输出该值,并且它是正数(.56)。

When I run this code 当我运行这段代码

var variance = findVariance(array);
    variance = parseFloat(variance);
    alert(typeof variance);

the result is 结果是

number

And the value is .56 (which I know because when I don't use parseFloat it returns .56 as a string). 值是.56(我知道这是因为当我不使用parseFloat时,它会返回.56作为字符串)。 So I am baffled when I run this code 所以当我运行这段代码时我很困惑

alert("variance " + variance);
alert("sd" + Math.sqrt(variance));

and both alerts return 并且两个警报都返回

NaN 为NaN

This is the code that creates the textarea, calls the function processData( which gathers the input from myTextArea into an array and then calls the function findStandardDeviation) I can post the variance function as well if you'd like. 这是创建文本区域的代码,调用了函数processData(它将来自myTextArea的输入收集到一个数组中,然后调用了函数findStandardDeviation)。如果您愿意,我也可以发布方差函数。

<textarea id="myTextArea" rows = "7" cols = "50"></textarea><br>

<button onclick="processData()">Done</button>

<p id = "sd"></p>

<script type = "text/javascript">

        var standard_deviation = 0;

        var sdOutput = document.getElementById('sd'); 

    function processData()
    {
        var arrayOfLines = document.getElementById('myTextArea').value.split('\n');


        findStandardDeviation(arrayOfLines);
    }

This is the most reducible form of my script I could manage: 这是我可以管理的最简化的脚本形式:

 var mean = 0; var median = 0; var count = length; var mode = 0; var variance = 0; var standard_deviation = 0; var meanOutput = document.getElementById('mean'); var countOutput = document.getElementById('count'); var sumOutput = document.getElementById('sum'); var varianceOutput = document.getElementById('variance'); var sdOutput = document.getElementById('sd'); function processData() { var arrayOfLines = document.getElementById('myTextArea').value.split('\\n'); var sum = findSum(arrayOfLines); findMeanOutput(arrayOfLines, sum); findVariance(arrayOfLines); findStandardDeviation(arrayOfLines); } function findSum(array) { var count = array.length; var sum = 0; for (var a = 0; a < array.length; a++) { sum += parseInt(array[a]); } countOutput.innerHTML = "Count: " + array.length; sumOutput.innerHTML = "Sum: " + JSON.stringify(sum); sum = parseInt(sum); return sum; } function findMean(array) //Used for finding mean and then returning it { var sum = 0; for (var a = 0; a < array.length; a++) { sum += parseFloat(array[a]); } mean = sum / array.length; return mean; } function findMeanOutput(array, sum) //finds mean and then establishes it as the mean for users input { mean = sum / array.length; meanOutput.innerHTML = "Mean: " + mean; } function findVariance(array) { var mean = findMean(array); var variance = "Variance: " + findMean(array.map(function(num) { return Math.pow(num - mean, 2); })).toFixed(2); varianceOutput.innerHTML = "Variance: " + variance; return variance; } function findStandardDeviation(array) { var variance = findVariance(array); variance = parseFloat(variance); alert(typeof variance); alert("variance " + variance); alert("sd" + Math.sqrt(variance)); sdOutput.innerHTML = "Standard Deviation: " + Math.sqrt(variance).toFixed(2); } 
 <html> <head> </head> <body> <p> Please enter a series of numbers, each separated by a new line.<br> <p> <textarea id="myTextArea" rows="7" cols="50"></textarea><br> <button onclick="processData()">Done</button> <p id="mean"></p> <p id="count"></p> <p id="sum"></p> <p id="variance"></p> <p id="sd"></p> </body> </html> 

.56 is not an integer, so you shouldn't use parseInt . .56不是整数,因此您不应使用parseInt parseFloat is the function you're looking for. parseFloat是您要寻找的功能。 Or much simpler: Number . 或更简单: Number

Try For this: 为此尝试:

in your case .56 is float, so use parseFloat 在您的情况下.56是浮动的,因此请使用parseFloat

  1. parseInt - convert string to integer number, if you will float to it then it will give 0, parseInt-将字符串转换为整数,如果您将其转换为整数,则将得到0,
  2. parseFloat - return number to float, parseFloat-返回浮点数,

I was appending the string "Variance: " to the variance variable alongside the actual variance, which when converted to a float still resulted in a NaN. 我将字符串“ Variance:”附加到实际变量的方差变量后面,当转换为浮点数时仍会产生NaN。 I solved it by swapping this: 我通过交换这个解决了它:

variance = parseFloat(variance);

out with this: 与此:

variance = parseFloat(+variance.match(/[\d.]+/)[0]);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM