JQuery - я получаю неожиданные результаты из основной математической формулы - PullRequest
2 голосов
/ 21 мая 2010

Привет, я хотел бы начать с того, что буду признателен всем, кто поможет мне в этом. Я построил небольшой калькулятор для расчета суммы, которую потребитель может ежегодно экономить на энергии, установив наземный тепловой насос или солнечные батареи.

Насколько я могу судить, математические формулы верны, и мой клиент подтвердил это вчера, когда я показал ему код. Две проблемы. Во-первых, калькулятор выводит смехотворно большие числа для первого результата. Вторая проблема заключается в том, что солнечный результат работает только тогда, когда в полях нет нулей.

Есть ли некоторые причуды в том, как писать математические формулы в JS или jQuery?

Любая помощь с благодарностью. Вот ссылка - http://www.olliemccarthy.com/test/johncmurphy/?page_id=249

А вот код всей функции -

$jq(document).ready(function(){ 

// Energy Bill Saver 

// Declare Variables 

var A = "";  // Input for Oil
var B = "";  // Input for Storage Heater
var C = "";  // Input for Natural Gas
var D = "";  // Input for LPG
var E = "";  // Input for Coal 
var F = "";  // Input for Wood Pellets
var G = "";  // Input for Number of Occupants 
var J = "";  
var K = "";
var H = "";
var I = "";

// Declare Constants 

var a = "0.0816"; // Rate for Oil
var b = "0.0963"; // Rate for NightRate
var c = "0.0558"; // Rate for Gas
var d = "0.1579";  // Rate for LPG
var e = "0.121";  // Rate for Coal
var f = "0.0828";  // Rate for Pellets
var g = "0.02675";  // Rate for Heat Pump

var x = "1226.4"; 


// Splittin up I to avoid error 

var S1 = ""; // Splitting up the calcuation for I
var S2 = ""; // Splitting up the calcuation for I
var S3 = ""; // Splitting up the calcuation for I
var S4 = ""; // Splitting up the calcuation for I
var S5 = ""; // Splitting up the calcuation for I
var S6 = ""; // Splitting up the calcuation for I



// Calculate H (Ground Sourced Heat Pump)

$jq(".es-calculate").click(function(){


    $jq(".es-result-wrap").slideDown(300);


    A = $jq("input.es-oil").val();
    B = $jq("input.es-storage").val();
    C = $jq("input.es-gas").val();
    D = $jq("input.es-lpg").val();
    E = $jq("input.es-coal").val();
    F = $jq("input.es-pellets").val();
    G = $jq("input.es-occupants").val();


    J = ( A / a ) + ( B / b ) + ( C / c ) + ( D / d ) + ( E / e ) + ( F / f ) ;

    H = A + B + C + D + E + F - ( J * g ) ;

    K = ( G * x ) ;


    if ( A !== "0" ) { S1 = ( ( ( A / a ) / J ) * K * a ) ; }
    else { S1 = "0" ; }

    if ( B !== "0" ) { S2 = ( ( ( B / b ) / J ) * K * b ) ; }
    else { S2 = "0" ; }

    if ( C !== "0" ) { S3 = ( ( ( C / c ) / J ) * K * c ) ; }
    else { S3 = "0" ; }

    if ( D !== "0" ) { S4 = ( ( ( D / d ) / J ) * K * d ) ; }
    else { S4 = "0" ; }

    if ( E !== "0" ) { S5 = ( ( ( E / e ) / J ) * K * e ) ; }
    else { S5 = "0" ; }

    if ( F !== "0" ) { S6 = ( ( ( F / f ) / J ) * K * f ) ; }
    else { S6 = "0" ; }


    I = S1 + S2 + S3 + S4 + S5 + S6 ;


    if(!isNaN(H)) {$jq("span.es-result-span-h").text(H.toFixed(2));}
    else{$jq("span.es-result-span-h").text('Error: Please enter numerals only');}

    if(!isNaN(I)) {$jq("span.es-result-span-i").text(I.toFixed(2));}
    else{$jq("span.es-result-span-i").text('Error: Please enter numerals only');}

    });

});

Ответы [ 4 ]

7 голосов
/ 21 мая 2010
  • Константы объявлены как строки. Они должны быть типа число (с плавающей точкой);

var a = 0.0816;

  • При выполнении математических операций над строкой (пользовательский ввод), конвертировать их в плавающие используя функцию parseFloat;

    A = parseFloat( $jq("input.es-oil").val() );

3 голосов
/ 21 мая 2010

Я бы упростил все это с помощью именованных переменных и объектов, которые имеют смысл, не проверены, но должны работать:

// Declare Constants 
var rates = { 
  Oil:           0.0816, // Rate for Oil
  StorageHeater: 0.0963, // Rate for NightRate
  NaturalGas:    0.0558, // Rate for Gas
  LPG:           0.1579, // Rate for LPG
  Coal:          0.121,  // Rate for Coal
  WoodPellets:   0.0828, // Rate for Pellets
  HeatPump:      0.02675 // Rate for Heat Pump
};
var x = 1226.4;

// Calculate H (Ground Sourced Heat Pump)
$jq(".es-calculate").click(function(){
    $jq(".es-result-wrap").slideDown(300);
    var normalizedTotal = 0;
    var total = 0;

    $jq.each({
      Oil:           $jq('input.es-oil').val(),
      StorageHeater: $jq('input.es-storage').val(),
      NaturalGas:    $jq('input.es-gas').val(),
      LPG:           $jq('input.es-lpg').val(),
      Coal:          $jq('input.es-coal').val(),
      WoodPellets:   $jq('input.es-pellets').val()
    }, function(key, value) {
      // make sure the value is a float and not a string:
      value = parseFloat(value); 

      // calculate our two totals
      normalizedTotal += value / rates[key];
      total += value;
    });

    var Occupants = parseInt($jq("input.es-occupants").val(), 10);

    var H = total - (normalizedTotal * rates.HeatPump);
    var I = total / normalizedTotal * Occupants * x;

    $jq("span.es-result-span-h").text(H.toFixed(2));
    $jq("span.es-result-span-i").text(I.toFixed(2));
});

Я также немного изменил математику, так как 0 в дивиденде отменяетдругие части в большинстве мест, и в некоторых формулах было несколько лишних.Кроме того, вышеупомянутое использует объект для хранения тарифов немного более чистым способом, используя соглашение.Создание этой вики, чтобы кто-нибудь еще мог ее улучшить.

Редактировать: Превратил расчет normalizedTotal и total в более простой $.each()

1 голос
/ 21 мая 2010

Попробуйте, пожалуйста, обратите внимание на внесенные мной изменения

var A; // Input for Oil
var B; // Input for Storage Heater
var C; // Input for Natural Gas
var D; // Input for LPG
var E; // Input for Coal 
var F; // Input for Wood Pellets
var G; // Input for Number of Occupants 
var J;
var K;
var H;
var I;

// Declare Constants 
var a = 0.0816; // Rate for Oil
var b = 0.0963; // Rate for NightRate
var c = 0.0558; // Rate for Gas
var d = 0.1579; // Rate for LPG
var e = 0.121; // Rate for Coal
var f = 0.0828; // Rate for Pellets
var g = 0.02675; // Rate for Heat Pump
var x = 1226.4;

// Splittin up I to avoid error 
var S1; // Splitting up the calcuation for I
var S2; // Splitting up the calcuation for I
var S3; // Splitting up the calcuation for I
var S4; // Splitting up the calcuation for I
var S5; // Splitting up the calcuation for I
var S6; // Splitting up the calcuation for I
// Calculate H (Ground Sourced Heat Pump)
$jq(".es-calculate").click(function(){
    $jq(".es-result-wrap").slideDown(300);

    A = parseInt($jq("input.es-oil").val(), 10);
    B = parseInt($jq("input.es-storage").val(), 10);
    C = parseInt($jq("input.es-gas").val(), 10);
    D = parseInt($jq("input.es-lpg").val(), 10);
    E = parseInt($jq("input.es-coal").val(), 10);
    F = parseInt($jq("input.es-pellets").val(), 10);
    G = parseInt($jq("input.es-occupants").val(), 10);

    J = (A / a) + (B / b) + (C / c) + (D / d) + (E / e) + (F / f);
    H = A + B + C + D + E + F - (J * g);
    K = (G * x);

    S1 = A !== 0 ? (((A / a) / J) * K * a) : 0;
    S2 = B !== 0 ? (((B / b) / J) * K * b) : 0;
    S3 = C !== 0 ? (((C / c) / J) * K * c) : 0;
    S4 = D !== 0 ? (((D / d) / J) * K * d) : 0;
    S5 = E !== 0 ? (((E / e) / J) * K * e) : 0;
    S6 = F !== 0 ? (((F / f) / J) * K * f) : 0;
    I = S1 + S2 + S3 + S4 + S5 + S6;

    $jq("span.es-result-span-h").text(H.toFixed(2));
    $jq("span.es-result-span-i").text(I.toFixed(2));
});

Ничего из этого не проверено - но если математика верна, как вы говорите, то это тоже должно работать. О вводимых нечисловых значениях; Вы должны применить какой-то фильтр к событию нажатия клавиш, чтобы разрешить только цифры.

1 голос
/ 21 мая 2010

Попробуйте обернуть ваш код внутри parseFloat и / или parseInt, где это необходимо. Этот раздел кода является хорошим кандидатом:

A = parseFloat( $jq("input.es-oil").val() );     // use parseInt if you expect an integer here
B = parseFloat( $jq("input.es-storage").val() ); // ditto for following lines
C = parseFloat( $jq("input.es-gas").val() );
D = parseFloat( $jq("input.es-lpg").val() );
E = parseFloat( $jq("input.es-coal").val() );
F = parseFloat( $jq("input.es-pellets").val() );
G = parseFloat( $jq("input.es-occupants").val() );

Редактировать ----

Теперь я вижу, что все ваши числа объявлены как строки. Не делай этого!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...