2016-03-04 70 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);