Javascript jQuery-I';我从一个基本的数学公式中得到了意想不到的结果

Javascript jQuery-I';我从一个基本的数学公式中得到了意想不到的结果,javascript,math,types,Javascript,Math,Types,嗨,我想首先说,我非常感谢任何人在这方面的帮助。我已经建立了一个小型计算器来计算一个消费者通过安装地源热泵或太阳能电池板每年可以节省多少能源 据我所知,数学公式是正确的,我的客户昨天在我给他看代码时验证了这一点。两个问题。首先,计算器输出的第一个结果的数字大得离谱。第二个问题是,只有当场中没有零时,太阳光的结果才起作用 关于如何用JS或jQuery编写数学公式,是否存在一些怪癖 非常感谢您的帮助。以下是链接- 这是整个函数的代码- $jq(document).ready(function(){

嗨,我想首先说,我非常感谢任何人在这方面的帮助。我已经建立了一个小型计算器来计算一个消费者通过安装地源热泵或太阳能电池板每年可以节省多少能源

据我所知,数学公式是正确的,我的客户昨天在我给他看代码时验证了这一点。两个问题。首先,计算器输出的第一个结果的数字大得离谱。第二个问题是,只有当场中没有零时,太阳光的结果才起作用

关于如何用JS或jQuery编写数学公式,是否存在一些怪癖

非常感谢您的帮助。以下是链接-

这是整个函数的代码-

$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');}

    });

});
  • 这些常量声明为 串。它们应该是 数字(浮动)
var a=0.0816

  • 对字符串进行数学运算时 (用户输入),将其转换为浮点 使用parseFloat函数

    A=parseFloat($jq(“input.es oil”).val())


在适当的情况下,尝试将代码包装在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() );
编辑----


我现在看到您的所有数字都声明为字符串。不要那样做

试试这个,请注意我所做的更改

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));
});
这些都没有经过测试——但是如果数学像你说的那样正确,那么这也应该行得通。
关于输入的非数值;您应该在按键事件上应用某种过滤器,只允许使用数字。

我将使用有意义的命名变量和对象简化所有这些,这些变量和对象未经测试,但应该可以工作:

// 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抵消了大多数地方的其他部分,并且在一些公式中有一点额外的抵消。此外,上面使用了一个对象来使用约定以更干净的方式存储速率。制作此维基,以便任何人都可以进一步改进


Edit:
normalizedTotal
total
的计算简化为一种更简单的方法

如果你想要数字,你必须使用数字……你拥有所有的字符串,这不会像你期望的那样。另外,使用有意义的变量名,javascript可以在之后缩小(而且非常容易),但是为什么要在编写时惩罚自己呢?是的:不需要无意义的变量名和注释来提醒您无意义的名称的含义。还有,为什么所有的东西都是字符串?完全正确而且很好。但是为什么没有人把它作为答案发布呢?你可能想给你的输入一个ID而不是一个类,并用#而不是。由于类通常用于样式设计,并且可以应用于多个元素,而ID应该是唯一的。另一句话,同样适用于所有类似的情况,
((E/E)/J)*K*E)
您正在用
E
进行除法和乘法,因此,这可以有效地简化为
E/J*K
。您的条件在
S1
-
S6
上是向后的,请修复,这样我可以+1:)它们也可以在原始的基础上简化,例如
((A/A)/J)*K*A)
可以是
((A/J)*K)
。修复了ternaries。你不能像你说的那样简化,因为你完全从方程中删除了常数。如果红利中的值为0,那么方程中的值为0,你可以简化它。此外,任何项的除法和乘法都可以删除,因为它等于
*1
。老实说,我没有仔细研究这些方程,但现在我看到它们都是除法和乘法的,所以删除它们没有什么害处。