How to solve margin calculation problem in Javascript?

Asked

Viewed 112 times

2

I have the following inputs:

1st Cost, where I inform the value of 6,23 2nd Margin, where I inform the value of 29,21

The JavaScript makes the automatic calculation and returns me 8,05 in value

Well it’s all right. But when I do it backwards the error happens.

1st Cost, where I inform the value of 6,23 2º Value, where I inform the value of 8,05

The JavaScript makes the automatic calculation and returns me 36.44 in the margin, and the correct one would be 29,21

Does anyone know what it can be?

Follows the code:

$(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{
       valor = valor.replace(",","");
    	 var inteiro = valor.substring(0,valor.length - 2);
       
       console.log(inteiro);
       
       var decimal = valor.substr(2);
       
       console.log(inteiro + "." + decimal);
       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 answer

3


There is an error in the add function:

The correct is:

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

All "console.log" snippets can be removed. They are only used for debugging.

  • as always thank you.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.