2017-02-16 20 views
0

им пытаются сделать некоторые функции алгоритма С помощью JavaScript и получить некоторые проблемыНеправильный математический алгоритм с javascript?

function Algorithm() { 
    var endone; 
    var endtwo; 
    var endtheend; 
    var v1 = document.getElementsByName("v1")[0].value; //worth to 91 
    var v2 = document.getElementsByName("v2")[0].value; //worth to 61 
    var v3 = document.getElementsByName("v3")[0].value; //worth to 20 

    endone = Math.round(v1 * 0.30); 

    endtwo = Math.round(((v2 + v3)/2) * 0.70); 

    endtheend = endone + endtwo; 


    document.getElementById("ending").innerHTML = "end : " + endtheend; 
} 

, если им делать то же алгоритм с калькулятором им получать 55.65, но когда им пытаются использовать эту функцию как-то им становится .

кто-то может знать, в чем проблема, и показать мне, как ее решить?

+1

Вам нужно разобрать строковые значения элементов на числа, такие как 'parseInt'. – vcsjones

+0

'v2 =" 61 "; v3 = "20"; v2 + v3 // «6120» ' – Bergi

+1

См. http://stackoverflow.com/questions/8976627/how-to-add-two-strings-as-if-they-were-numbers – trincot

ответ

2

Проблема в том, что v1, v2 и v3 не являются номерами. Это струны. Таким образом, каждый расчет, который вы делаете, зависит от неявных преобразований и операций между строками.

Например, в следующем фрагменте мы имеем неявное преобразование строкового значения «91» в двойное плавающее число, а затем выполняется обычная mulitplication.

var v1 = "91"; 
 
console.log(v1*0.3);

С другой стороны ниже:

var v2 = "61"; 
 
var v3 = "20"; 
 

 
console.log((v2 + v3)/2)

У нас есть конкатенации "61" + "20" результаты в новой строке " 6120 ", а затем" 6120 "неявно преобразуется в двойное плавающее число и выполняется разделение на 2.

Какое решение?

Вы должны проанализировать эти значения либо с помощью parseInt или parseFloat, как показано ниже:

var v2 = "61"; 
 
var v3 = "20"; 
 

 
console.log((parseInt(v2,10) + parseInt(v3,10))/2)

+0

попытался это сделать: –

+0

I предложите добавить способ анализа значений. Я мог догадаться, что тот, кто спросил, не знает, как это сделать. –

+1

Я просто сделал это :) – Christos

0

Когда вы получаете value свойство HTMLInputElement «s, что вы получите это string , И оператор +, примененный к двум строкам, просто объединяет их, поэтому, если, например, v2 == "7" и v3 === "0", когда вы сделаете (v2 + v3), вы получите "70".

Решение вашей проблемы, чтобы просто передать значения через parseInt:

var v1 = parseInt(document.getElementsByName("v1")[0].value, 10); 
var v2 = parseInt(document.getElementsByName("v2")[0].value, 10); 
var v3 = parseInt(document.getElementsByName("v3")[0].value, 10); 
// The second argument to parseInt isn't needed if you only target newer browsers. 

Я предлагаю вам прочитать на type coercion in JavaScript для получения дополнительной информации.

0

Проблема заключается в том, что все ваши значения (v1, v2, v3) имеют тип String. Сначала вам нужно преобразовать их в Number. Таким образом, следующий код должен работать:

function Algorithm() { 
    var endone; 
    var endtwo; 
    var endtheend; 
    var v1 = Number(document.getElementsByName("v1")[0].value); 
    var v2 = Number(document.getElementsByName("v2")[0].value); 
    var v3 = Number(document.getElementsByName("v3")[0].value); 
    endone = Math.round(v1 * 0.30); 
    endtwo = Math.round(((v2 + v3)/2) * 0.70); 
    endtheend = endone + endtwo; 
    document.getElementById("ending").innerHTML = "end : " + endtheend; 
} 

вы также можете использовать parseInt, если ваше значение содержит какие-либо символы алфавита.