2016-03-04 37 views
0

錯誤的百分比,我有以下輸入:的JavaScript計算兩個輸入

cost,在那裏我在貨幣值的類型,比如6,23profit,在那裏我一個百分比值像29,21類型和value其中總和顯示兩個值。

的JavaScript做數學和cost +在profit鍵入的百分比的貨幣的價值,在這種情況下,結果是8,056,23 + 29,21%)返回我value值。

但如果試圖做同樣的,但通知value,而不是profit,一樣8,05,這樣的JavaScript將返回我的29,21profit,但它返回我36,44

有誰知道它可能是什麼?

這裏是我的代碼:

$(document).ready(function() { 
 
    $(".valor").on("input", function() { 
 
     // Margem 
 
     var valor = $(this).val(); 
 
     var valorCorrigido = parseFloat(adicionarPontos(valor)); 
 
      
 
     var valorFloat = parseFloat(valorCorrigido) || 0.0; 
 

 
     // Custo 
 
     var valorCusto = $('#custo').val(); 
 
     var valorCustoCorrigido = parseFloat(removerPontos(valorCusto)); 
 
     var valorCustoFloat = parseFloat(valorCustoCorrigido) || 0.0; 
 

 
     // Calculo 
 
     var calculo = (parseFloat(valorFloat) - parseFloat(valorCustoFloat))/parseFloat(valorCustoFloat) * 100; 
 
     var inputMargem = $(this).attr("margem"); 
 

 
     $("#" + inputMargem).val(calculo.toFixed(2)).trigger('blur'); 
 
    }); 
 
    // Faz o calculo do valor com base na margem 
 
    $(".margem").on("input", function() { 
 
     // Margem 
 
     var valorMargem = $(this).val(); 
 
     var valorMargemCorrigido = parseFloat(adicionarPontos(valorMargem)); 
 
     var valorMargemFloat = parseFloat(valorMargemCorrigido) || 0.0; 
 

 
     // Custo 
 
     var valorCusto = $('#custo').val(); 
 
     var valorCustoCorrigido = parseFloat(removerPontos(valorCusto)); 
 
     var valorCustoFloat = parseFloat(valorCustoCorrigido) || 0.0; 
 

 
     // Cálculo 
 
     var calculo = (parseFloat(valorCustoFloat) * parseFloat(valorMargemFloat)/100) + parseFloat(valorCustoFloat); 
 
     var inputValor = $(this).attr("valor"); 
 

 
     var resultadoMonetario = calculo.toFixed(2).toString(); 
 
     resultadoMonetario = resultadoMonetario.replace(".", ","); 
 

 
     $("#" + inputValor).val(resultadoMonetario).trigger('blur'); 
 
    }); 
 

 
    function removerPontos(valor){ 
 
     valor = valor.replace(".",""); 
 
     valor = valor.replace(",","."); 
 
     return valor;   
 
    } 
 
    
 
    function adicionarPontos(valor){ 
 
     if(valor.length == 1){ 
 
      return valor; 
 
     } 
 
     else{ 
 
     if(valor.length == 2){ 
 
      return valor; 
 
     } 
 
     else{ 
 

 
     // The problem was here 
 

 
     valor = valor.replace(",",""); 
 
     var inteiro = valor.substring(0,valor.length - 2); 
 
     var decimal = valor.substr(2); 
 
     return inteiro + "." + decimal; 
 
     } 
 
     } 
 
    } 
 
}); 
 

 
$('input').mask('00.000.000,00', { 
 
    reverse: true 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
 

 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.13.4/jquery.mask.js"></script> 
 

 

 
Custo: 
 
<input type='text' id='custo' class='custo valores' name='custo'> 
 
<br> 
 
<br> Valor: 
 
<input type='text' id='valor1' class='valor valores' name='valor1' margem='margem1'> Margem: 
 
<input type='text' id='margem1' class='margem valores' name='margem1' valor="valor1"> 
 

 
<br> Valor: 
 
<input type='text' id='valor2' class='valor valores' name='valor2' margem='margem2'> Margem: 
 
<input type='text' id='margem2' class='margem valores' name='margem2' valor="valor2">

回答

1

的計算似乎不正確,因爲在JavaScript中的小數點分隔符未本地化。

6,23 * 29,21 // 21 

6.23 * 29.21 // 181.97830000000002 

parseFloat(6,23); // 6 

parseFloat(6.23); // 6.23 

可以使用Number.prototype.toLocaleString()或貨幣格式插件時,你做你的計算的值設置格式進行顯示,但是你的custovalormargem值應被格式化爲.小數點分隔符。

0

如果您的總利潤等式爲total = cost + (cost * profit)

然後你的利潤%方程應該是profit = (total - cost)/cost

這裏有兩個功能可以爲您提供所需的功能。你可能有興趣使用它們,而不是像你在你的問題中做的那樣排隊計算。

function getProfitTotal(cost, profit) { 
    cost = parseFloat(cost, 10); 
    profit = parseFloat(profit, 10)/100; 

    return cost + (cost * profit); 
} 

function getProfitMargin(cost, total) { 
    cost = parseFloat(cost, 10); 
    total = parseFloat(total, 10); 

    return (total - cost)/cost * 100; 
} 

因此getProfitMargin(6.23, getProfitTotal(6.23, 21.23));將輸出21.23。在設置文本字段中的值之前,只需使用.toFixed(2)

在旁註中,如果值爲NaN,則只應重置字段的值。到目前爲止,我個人無法在你提供的例子中寫小數,因爲這個。

此外,所有數字都必須用點分隔。只需解析並使用globalization library格式化您的號碼,因爲您的當前功能如前所述無法正常工作。

0

這樣看來,問題是在這部分代碼:

valor = valor.replace(",",""); 
var inteiro = valor.substring(0,valor.length - 2); 
var decimal = valor.substr(2); 
return inteiro + "." + decimal; 

將其更改爲在此之後工作得很好:

var inteiro = valor.substring(0,valor.length - 2); 
var decimal = valor.substring(valor.length - 2, valor.length);