0

重複の可能性:
JavaScriptで加算が機能しない

だから私は自分がプレイするゲームのためにある種の計算機に取り組んできました。私はそれを解決するために以下の式を持っています、しかしそれは実際にそれらを加えるのではなく、値をつなぎ合わせています。したがって、何も入力しないと、値として「000000000000000000000000」が得られ、totalattackを1に変更すると、「1000000000000000000000」が得られます。少し見回してみましたが、なぜそうなっているのかよくわかりません。またはそれを修正する方法。

var invasionattack = totalattack + (600*DSC) + (60*translator) + (35*mindcontrol) + (30*psionic) + (40*mutagen) + (2500*cartridge) + (300*stryll) + (15*mech) + (20*bane) + (30*cbane) + (60*hbane) + (45*obane) + (75*mbane) + (decimator*200);
                alert('Invasion Attack From Modules: ' + invasionattack);

誰かが興味を持っている場合/それが関連している場合は、完全なコードはここで見つけることができます:http: //glcalc.x10.mx/invasioncalc.htmlそしてソースを表示します。

どこかに乗数のバグもありますが、後で見つけます。

4

1 に答える 1

2

文字列の連結は加算と同じではありません。文字列ではなく、数字を扱っていることを確認する必要があります。

とはいえ、関数には他にも多くの潜在的な落とし穴がありますcalculatechance

必要なときに変数を宣言し、後で変数を再宣言すると、変数の巻き上げが原因で問題が発生します。

あなたは「TruthyandFalsy」の値を使用していますが、それ自体は必ずしも悪いことではなく、実際には(JavaScriptの美しい部分の1つであるIMHO)、それがどのように機能するかを理解しないと、問題が発生する可能性があります。

匿名のコードブロックを使用しているようです:

{
    if (decimator == 0) {
        var decimatormult = 1;
    };
    if (!decimator == 0) for (var decimatormult = 1; decimator > 0; decimator--) {
        decimatormult * 1.07
    }
}

異なるブラウザがそれをどのように解釈するかはわかりません。それらを削除し、コメントを使用してセクションを描く方がよいでしょう。

totalattackおそらくしたくないときに値を上書きしています。

とにかく、関数は次のように記述した方がよい場合があります。

var calculatechance = function calculatechance() {
    'use strict';
    var bane = parseFloat(document.getElementById('bane').value, 10) || 0, // Convert to a number (float) and default to 0 if parsing fails.
        cbane = parseFloat(document.getElementById('cbane').value, 10) || 0,
        obane = parseFloat(document.getElementById('obane').value, 10) || 0,
        hbane = parseFloat(document.getElementById('hbane').value, 10) || 0,
        mbane = parseFloat(document.getElementById('mbane').value, 10) || 0,
        exotic = parseFloat(document.getElementById('exotic').value, 10) || 0,
        decimator = parseFloat(document.getElementById('decimator').value, 10) || 0,
        mindcontrol = parseFloat(document.getElementById('mindcontrol').value, 10) || 0,
        translator = parseFloat(document.getElementById('translator').value, 10) || 0,
        anubix = parseFloat(document.getElementById('anubix').value, 10) || 0,
        attack = parseFloat(document.getElementById('attack').value, 10) || 0,
        // Calculate Invasion Attack
        anubixattack = anubix === 100 ? 1 : 0, // Use of ternary operator
        // Check Checkboxes
        obelisk = document.getElementById("obelisk").checked ? 1 : 0,  // Use of ternary operator with truthy/falsy as .checked equals "checked" (truthy) or "" (falsy)
        foci = document.getElementById("foci").checked ? 1 : 0,
        amp = document.getElementById("amp").checked ? 1 : 0,
        overcharge = document.getElementById("overcharge").checked ? 1 : 0,
        crux = document.getElementById("crux").checked ? 1 : 0,
        mech = document.getElementById("mech").checked ? 1 : 0,
        DSC = document.getElementById("DSC").checked ? 1 : 0,
        kulgox = document.getElementById("kulgox").checked ? 1 : 0,
        terror = document.getElementById("terror").checked ? 1 : 0,
        psionic = document.getElementById("psionic").checked ? 1 : 0,
        mutagen = document.getElementById("mutagen").checked ? 1 : 0,
        stryll = document.getElementById("stryll").checked ? 1 : 0,
        cartridge = document.getElementById("cartridge").checked ? 1 : 0,
        // Other variables
        exoticatt = 0,
        decimatormult = 1,
        totalattack = attack,
        invasionattack = 0;
    // Calculate Exotic Bio Disruptor Multiplier
    // no logic currently here
    // Calculate Exotic Bio Disruptor Static IAttack
    switch (exotic) {
    case 0:
        exoticatt = 0;
        break;
    case 1:
        exoticatt = 250;
        break;
    case 2:
        exoticatt = 350;
        break;
    default:
        exoticatt = (100 * exotic) + 150;
        break;
    }
    //Calculate Atmospheric Decimator Multiplier
    if (decimator !== 0) {
        while (decimator > 0) {
            decimatormult *= 1.07;
            decimator -= 1;
        }
    }
    //Calculate Attack
    if (obelisk) {
        totalattack += attack * 1.1;
    }
    if (foci) {
        totalattack *= 1.05;
    }
    if (amp) {
        totalattack *= 1.15;
    }
    if (crux) {
        totalattack *= 1.1;
    }
    if (overcharge) {
        totalattack *= 1.08;
    }
    if (anubixattack) {
        totalattack += attack * 1.03;
    }
    //Calculate Invasion Attack
    invasionattack = (
        totalattack
        + (600 * DSC)
        + (60 * translator)
        + (35 * mindcontrol)
        + (30 * psionic)
        + (40 * mutagen)
        + (2500 * cartridge)
        + (300 * stryll)
        + (15 * mech)
        + (20 * bane)
        + (30 * cbane)
        + (60 * hbane)
        + (45 * obane)
        + (75 * mbane)
        + (decimator * 200)
        + exoticatt
    );
    alert('Invasion Attack From Modules: ' + invasionattack.toString());
    invasionattack = invasionattack * decimatormult;
    if (kulgox) {
        invasionattack *= 1.1;
    }
    if (terror) {
        invasionattack *= 1.08;
    }
    alert('Invasion Attack: ' + invasionattack);
};
于 2012-12-09T17:13:09.827 に答える