2011-08-04 74 views
0

我一直努力讓從PHP移植到Java腳本變化方程的係數,但似乎無法得到它的工作。從PHP轉換數學方程式爲Javascript(jQuery的)

原始PHP腳本:

// define variables, strip spaces 
$weights = $_POST['weights']; 
// define coefficient of variation function 
function cv($array){ 
    $n = 0; 
    $mean = 0; 
    $M2 = 0; 
    foreach($array as $x){ 
     if ($x != NULL AND $x != '') { 
      $n++; 
      $delta = $x - $mean; 
      $mean = $mean + $delta/$n; 
      $M2 = $M2 + $delta*($x - $mean); 
      $total = $total + $x; 
     } 
    } 
    return (((sqrt($M2/($n - 1)))/($total/$n))*100); 
} 
$cv = (cv($weights)); 

這基本上帶有一個數組,並計算出變異係數爲它。現在,當我嘗試通過一些jQuery函數將其轉換爲Javascript:

var fields = $('#cvform').serializeArray(); 
     var count = 0; 
     var num = 0; 
     var mean = 0; 
     var m2 = 0; 
     var total = 0; 
     var delta = 0; 
     jQuery.each(fields, function(i, field){ 
     if (field.value > 0) { 
      num++; 
      delta=(field.value-mean); 
      mean=(mean+delta/num); 
      m2=(m2+delta*(field.value-mean)); 
      total=(total+field.value); 
     }; 
     }); 
     var cov=(((Math.sqrt(m2/(num-1)))/(total/num))*100); 
     $("<span>Coefficient of Variation: " + cov + "</span>").appendTo('#cvdisplay'); 

雖然JavaScript函數輸出一個答案,這是不正確的。如果我輸入值「3,3,2,3,3,4」PHP腳本給出21.08的輸出,這是正確的。 javascript函數爲我提供了0.0011418432035849642的值。

任何人都可以指出方程式的不同之處嗎?

+2

有一件事要嘗試:明確地將「field.value」轉換爲一個數字,然後再搞亂它。 'var v = 1 * field.value;'例如。 – Pointy

+0

@Pointy是正確的:http://jsfiddle.net/qvj3U/(如果您將'fields'變量更改爲'var fields = [「3」,「3」,「2」,「3」,「3」 ,「4」];'你得到了錯誤的答案。) – JJJ

+0

據我所知,'serializeArray()'產生字符串值,所以需要浮點/整數轉換 – Tomm

回答

1

您需要將您的數組值通過parseFloat()到浮動(或整數,parseInt(),只要適合你):

var fields = $('#cvform').serializeArray(); 
var count = 0; 
var num = 0; 
var mean = 0; 
var m2 = 0; 
var total = 0; 
var delta = 0; 
$.each(fields, function(i, field) { 
    alert(field.value); 
    if (parseFloat(field.value) > 0) { 
     num++; 
     delta = (parseFloat(field.value) - mean); 
     mean = (mean + delta/num); 
     m2 = (m2 + delta * (parseFloat(field.value) - mean)); 
     total = (total + parseFloat(field.value)); 
    } 
}); 
var cov = (((Math.sqrt(m2/(num - 1)))/(total/num)) * 100); 
$("<span>Coefficient of Variation: " + cov + "</span>").appendTo('#cvdisplay'); 
-1

這裏是您所提供的功能的直接轉換。你必須傳入一個javascript數組數組,並且它產生你正在尋找的結果(至少根據Node.js中編寫的單元測試)。您應該在另一個函數中進行類型轉換(字符串到數組)以分離您的擔憂並使代碼更易於推理;

var CoV = function(ary) { 
    var mean = 0, 
     n = 0, 
     m2 = 0, 
     total = 0, 
     delta; 

    for(var i = 0, l = ary.length; i < l; i += 1) { 
     n += 1; 

     delta = ary[i] - mean; 
     mean = mean + delta/n; 
     m2 = m2 + delta * (ary[i] - mean) 
     total = total + ary[i] 
    } 

    console.log(mean); 
    console.log(m2); 
    console.log(total); 

    return ((Math.sqrt(m2/(i - 1)))/(total/i)) * 100; 
}; 
1

問題是JavaScript線 total=(total+field.value);預期導致0332334,而不是18。正在應用字符串連接而不是數字加法。 total += parseInt(field.value);

0
function stDeviation(array){ 
    var L= array.length, 
    mean= array.reduce(function(a, b){ 
     return a+b; 
    })/L, 
    dev= array.map(function(itm){ 
     var tem= itm-mean; 
     return tem*tem; 
    }); 
    return Math.sqrt(dev.reduce(function(a, b){ 
     return a+b; 
    })/L); 
} 

Math.mean= function(array){ 
    return array.reduce(function(a, b){ return a+b; })/array.length; 
} 
Math.stDeviation=function(array){ 
    var mean= Math.mean(array); 
    dev= array.map(function(itm){return (itm-mean)*(itm-mean); }); 
    return Math.sqrt(dev.reduce(function(a, b){ return a+b; })/array.length); 
} 


var A2= [6.2, 5, 4.5, 6, 6, 6.9, 6.4, 7.5]; 
alert ('mean: '+Math.mean(A2)+'; deviation: '+Math.stDeviation(A2)) 
0

您可以通過解析整數值解決這個問題

在這裏,我改變了一下代碼,並讓它工作。我基本上隔離了更多的細分市場。讓它更直接。

<?php 
$weights = Array(3,3,2,3,3,4); 

// define coefficient of variation function 
function cv($array) { 
    $n = 0; 
    $mean = 0; 
    $M2 = 0; 
    $total = 0; 

    foreach($array as $x) { 
    if (!empty($x)) { 
     $n++; 
     $delta = $x - $mean; 
     $mean = $mean + $delta/$n; 
     $M2 = $M2 + $delta * ($x - $mean); 
     $total = $total + $x; 
    } 
    } 

    $sqrt = sqrt($M2/($n - 1)); 
    $tn = $total/$n; 
    echo "Sqrt is $sqrt tn is $tn"; 

    return ($sqrt/$tn) * 100; 
} 

$cv = cv($weights); 
?> 
<html> 
<head> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
<script type="text/javascript"> 
$(document).ready(function() { 
    var fields = Array(3,3,2,3,3,4); 
    var count = 0; 
    var n = 0; 
    var mean = 0; 
    var m2 = 0; 
    var total = 0; 
    var delta = 0; 

    jQuery.each(fields, function(i, field) { 
    //var x = field.value; 
    var x = 1 * field; 

    if (x > 0) { 
     n++; 
     delta = (x - mean); 
     mean = (mean + (delta/n)); 
     m2 = (m2 + delta * (x - mean)); 
     total = (total + x); 
    }; 
    }); 

    var sqrt = Math.sqrt(m2/(n - 1)); 
    var tn = total/n; 
    var cov = ((sqrt/tn) * 100); 
    console.log("Total is: "+ total); 
    console.log("Sqrt is " + sqrt + " tn is " + tn + " cov is " + cov); 

    $('#js').text("JS Output is: " + cov); 
}); 
</script> 
</head> 
<body> 
    <div> 
    <div>PHP Output: <?=$cv;?></div> 
    <div id="js"></div> 
    </div> 
</body> 
</html>