2012-12-09 2 views
0

가능한 중복 : 자바 스크립트 수학 Erroring


Addition is not working in JavaScript

그래서 내가 플레이 게임에 대한 종류의 계산기에 근무했습니다. 나는 아래의 수식을 가지고 있지만 실제로 그것을 추가하는 대신 값을 함께 묶습니다. 그래서 아무 것도 넣지 않으면 값이 "000000000000000000000000"이됩니다. 그리고 totalattack을 1로 변경하면 "10000000000000000000000"이됩니다. 조금 둘러 보았는데 왜 그렇게하는지 확신 할 수 없습니다. 또는 그것을 고치는 방법. 누군가가 호기심 경우는 관련이 경우

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 다음 소스를 볼 수 있습니다.

승수가있는 버그가 있지만 어쨌든 나중에 찾으실 수 있습니다.

답변

2

문자열 연결은 덧셈과 같지 않습니다. 문자열이 아닌 숫자를 처리해야합니다.

그렇다면 calculatechance 함수에는 여러 가지 잠재적 함정이 있습니다.

변수를 필요로 할 때 변수를 선언하고 나중에 변수를 다시 선언하면 나중에 모두 variable hoisting으로 인해 문제가 발생할 수 있습니다.

"Truthy and Falsy"값을 사용하고 있습니다. 그 자체로 나쁜 것은 아니며 실제로는 (JavaScript의 아름다운 부분 중 하나 인 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); 
}; 
+0

와우, 쓰레기 :

은 모든 함수가 더 나은로 기록 될 수있다. 정말 고맙습니다! Exotic Bio Disruptor Multiplier에 아무것도없는 이유는 그와 함께 버그가있어서 내가 아직도 놀고 있었기 때문입니다. –

+0

@SeanCaplin : 도와 드리겠습니다. – pete