Jump to content
Rafacharkman

Problema com casas decimais

Recommended Posts

Olá, estou com um problema que muitos provavelmente tiveram ou terão futuramente, que é calculos de casas decimais no javascript. 

No caso seria somente controlar a quantidade de casas decimais que o valor tem entre os elementos calculados, porém como eu posso por exemplo calcular a quantidade de casas decimais de um valor? tentei .length porémsó funciona com strings, e no caso só preciso calcular a quantidade de casas decimais e travar no maior valor possivel.

 

Já tentei todas as soluções possiveis mas nenhuma resolveu esse cálculo abaixo. No caso só me restou essa idéia que tive porém queria saber se encontro o melhor método para o mesmo.

 

var x = 0.123123;
var y = 0.1;
var floatlimit = ???; 	//variavel que conterá o n. de casas decimais do valor com maior extensão decimal
var z = x + y

document.getElementById("demo").innerHTML = z.toFixed(floatlimit);

 

Share this post


Link to post
Share on other sites

Rafacharkman

Se o que você quer é saber o TAMANHO do maior decimal você pode fazer o seguinte:


var x = 0.123123;
var y = 0.1;

 

//Converter o valor numerico para STRING

var string_x = x.toString();

 

//Quebra a string no "." ficando com o array string_x[0] = 0 e string_x[1] = 123123

var split_x = string_x.split(".");

 

//Conta a quantidade de números na string_x[1] que tem 123123 igual a 6
var size_x = split_x[1].length;

 

//Faz os mesmos 3 processos acima para contar o tamanho de casa decimais do Y que vai resultar em string_y[1] = 1 com tamanho 1;

var string_y = y.toString();
var split_y = string_y.split(".");
var size_y = split_y[1].length;

 

//Pergunta se size_x (6) é maior que size_y (1) e move o maior tamanho de casas decimais para a sua variável FLOATLIMIT que você quer.

if(size_x > size_y) {
    var floatlimit = size_x;
} else {
    var floatlimit = size_y;
};

 

//Mostra uma mensagem de alerta com os valores x = 6, y = 1 e floatlimit = 6

alert("Quantidade de casas decimais em X = "+size_x);
alert("Quantidade de casas decimais em Y = "+size_y);
alert("Quantidade de casas decimais para exibir com FLOATLIMIT = "+floatlimit);

 

//Soma os valores

var z = x + y

 

//Exibe no campo "DEMO" a sua variável Z com 6 casas decimais que será 0.223123;
document.getElementById("demo").innerHTML = z.toFixed(floatlimit);

 

Esper ter ajudado

 

Att.

Felipe Coutinho

Share this post


Link to post
Share on other sites
2 horas atrás, Felipe Guedes Coutinho disse:


Vlw, Felipe Guedes Coutinho, eu pensei nisso também enquanto estava tentando resolver aqui e conclui nesse código que vou deixar aqui em baixo. Único problema que tive foi com o .reduce() e .reduceRight() aonde um 1º ciclo do Loop só lê o
return cache; e o outro faz a mesma coisa no ultimo ciclo.

Para quem tiver duvidas, fica aqui o código:
 

var x = [null, 0.1, 0.123123];
 
var floatlimit = x.reduce( (cache, value) => {
  value = String(value).split('.');
  value[1] = Number(value[1].length);

  if(cache < value[1]) cache = value[1];

  return cache;
});

document.write( 
	x.reduce( (cache,value) => cache+value ).toFixed(floatlimit) 
);

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By binds
      Olá Caríssimos,
       
      Não tenho muito conhecimento de javascript, desde já agradeço se alguém puder me ajudar.
      Preciso criar uma página simples de validação por idade para acessar uma página, a ideia é simples:
      se a pessoa nasceu antes de 2002 redireciona a página meusite_com_br/maior 
      mas se ela nasceu depois de 2002 redireciona a página meusite_com_br/menor
      Garimpando achei o código abaixo que fiz alguns ajustes, porém não sei como abrir as respectivas paginas meusite_com_br/menor ou meusite_com_br/maior como resultado, o resultado nesse caso são textos:  "MENOR 18" : "MAIOR DE 18"
       
      <!DOCTYPE html> <html> <body> <CENTER> <h2>Validador de Idade</h2> <p>Digite o ano que você nasceu para acessar o site:</p> <input id="age" value="Ex: 1990" /> <br> <button onclick="myFunction()">ACESSAR SITE</button> <p id="demo"></p> <script> function myFunction() {   var age, voteable;   age = Number(document.getElementById("age").value);   if (isNaN(age)) {     voteable = "Você não inseriu um ano válido. <BR> Exemplo: 2020";   } else {     voteable = (age > 2002) ? "MENOR 18" : "MAIOR DE 18";   }   document.getElementById("demo").innerHTML = voteable; } </script> </CENTER> </body> </html>  
      Novamente agradeço a ajuda!
      Luis
       
    • By violin101
      Caros amigos, saudações...
       
      Desculpa em recorrer aos amigos, mas estou com uma dúvida referente a SOMA total de uma coluna da TABELA.
       
      Abaixo postei o trecho onde alimento a Tabela via Javascript.
       
      os Campos(input) são passado dessa forma:
      ====[ qtde......: 3
      ====[ vlrunit...: 1,01
      ====[ vlrtotal..: 3,03
       
      O Problema que estou me deparando é a Soma Total do Campo vlrtotal.
      $("#btn-agregar").on("click",function(){ //Recebe dados do Forumulário e Atualiza a Tabela var qtde = document.getElementById("qtde").value; var vlrunit = document.getElementById("vlrunit").value; var vlrtotal = document.getElementById("vlrtotal").value; if(qtde == "" || vlrunit == "" || vlrtotal == ""){ alert("Atenção! Nenhuma QUANTIDADE ou VALOR foi informado."); } else { html = "<tr>"; html += "<td><input type='hidden' name='idProdutos[]' value='"+infoprd[0]+"'>"+infoprd[1]+"</td>"; html += "<td><input type='hidden' name='descricao[]' value='"+infoprd[2]+"'>"+infoprd[2]+"</td>"; html += "<td style='text-align:center;'>"+infoprd[3]+"</td>"; html += "<td style='text-align:center;'>"+qtde+"</td>"; html += "<td style='text-align:right;'>"+vlrunit+"</td>"; html += "<td style='text-align:right;'>"+vlrtotal+"</td>"; html += "<td style='text-align:center;'>"+ "<button type='button' class='btn btn-danger btn-remove-produto' style='padding: 2px 5px;' title='Remover Item da Lista'>"+ "<span class='fa fa-remove'></span></button></td>"; html += "</tr>"; $("#tbventas tbody").append(html); sumar(); $("#btn-agregar").val(null); $("#descricao").val(null); $("#cod_interno").val(null); $("#prd_unid").val(null); $("#qtde").val(null); $("#vlrunit").val(null); $("#vlrtotal").val(null); } });  
      O trecho do Código abaixo é a função para realizar a soma.
      function sumar(){ subtotal = 0; $("#tbventas tbody tr").each(function(){ subtotal = subtotal + Number($(this).find("td:eq(5)").text()); }); $("input[name=subtotal]").val(subtotal.toFixed(2)); }  
       
      Infelizmente não consigo realizar a Soma do VlrTotal, o sistema mostra apenas NaN, ou apenas 0.
       
      Como consigo efetuar a soma correta no Formato MOEDA ?
       
      Grato,
       
       
      Cesar
       
       
    • By marsolim
      fala rapaziada tudo bem? sabe me dizer se tem diferença de performance, de compatibilidade e etc e tal entre o jquery $(this).val() e o javascript puro this.value? tava tentando pesquisar aqui mas não achei nada sobre.
      grato
    • By SaraAlcaras
      Olá galera! Estou criando um jogo da velha para coloca no meu portfólio, porem estou com um pequeno problema que não consigo resolver.. Quando o jogo finaliza a tela da uma ampliada/expandida no tamanho é quase imperceptível porem é algo que eu gostaria de mudar. Qual propriedade posso usar no css pra evitar que isso aconteça?
       
      Código CSS:

       
      :root{ --O-color: rgb(10, 177, 243); --X-color: rgb(253, 148, 148); --E-color: rgb(0, 0, 0); } * { margin: 0; padding:0; box-sizing: border-box; } body { display: grid; align-items: center; justify-content: center; font-family: grenze; height: 100vh; background-color: rgb(153, 153, 153); } .nextPlayer{ color: rgb(60, 62, 63); border: 1px solid rgb(211, 223, 104); box-shadow: 3px 5px 12px rgb(0, 0, 0); } .players { color: rgb(60, 62, 63); border: 1px solid rgb(211, 223, 104); box-shadow: 3px 5px 12px rgb(0, 0, 0); height: 55px; display: flex; flex-direction: column; justify-content: space-evenly; } .player{ display: flex; } .topo { display: flex; flex-direction: row; align-items: center; justify-content: space-evenly; margin-bottom: 20px; } .topo .players, .topo .nextPlayer { font-family: grenze; font-weight: bold; border-radius: 4px; } .title { font-size: 3rem; color: rgb(60, 62, 63); margin-bottom: 0; } .title2 { display: none; } .board { display: grid; grid-template-columns: repeat(3, 178px); grid-template-rows: repeat(3, 130px); gap: 1rem; cursor: pointer; } .board.game-over{ opacity: 0.10; } .cell { display: grid; align-items: center; justify-content: center; background-color: white; border-radius: 4px; font-size: 2rem; font-weight: bold; color: #00000066; } .cell:not(.O):not(.X):hover { box-sizing: 0 20px 25px -5px rgba(0, 0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0, 0.4); } .cell.O, .cell.X, .game-over .cell { cursor: not-allowed; } .cell.O { background-color: var(--O-color); } .cell.X { background-color: var(--X-color); } footer{ text-align: center; font-size: 30px; } .winner-message{ margin: 1rem; } .winner-message span.O{ color: var(--O-color); } .winner-message span.X{ color: var(--X-color); } .winner-message span.E{ color: var(--E-color); } button { padding: 0.9rem 1.5rem; border: none; border-radius: 5px; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0, 0.6); background-color: rgb(68, 255, 146); color: white; font-size: 1.2rem; cursor: pointer; } @media only screen and (max-width: 767px) and (orientation:portrait) { body { width: 100%; text-align: justify; } .board{ grid-template-columns: repeat(3, 88px); grid-template-rows: repeat(3, 80px); -webkit-tap-highlight-color: transparent; } button { font-size: 10px; } .cell { border-radius: 3px; font-size: 1rem; } footer { font-size: 13px; } .title { font-size: 1.5rem; display: none; padding: 0.6em; /* transform: translateY(80%); */ } .title2 { display: flex; font-size: 1.5rem; padding: 0.6em; color: rgb(60, 62, 63); } .topo{ flex-direction: column; } .players { height: 65px; width: 95px; align-items: center; } .nextPlayer{ text-align: center; height: 22px; width: 118px; /* transform: translateY(-150%); */ } } @media only screen and (max-width: 767px) and (orientation:landscape) { body { width: 100%; text-align: justify; } .board { grid-template-columns: repeat(3, 60px); grid-template-rows: repeat(3, 60px); -webkit-tap-highlight-color: transparent; } footer { font-size: 0.5rem; display: flex; flex-direction: row; align-items: center; justify-content: space-evenly; } button { font-size: 0.5rem; } .title { font-size: 0.8rem; } .players{ height: 30px; width: 50px; align-items: center; font-size: 0.5rem; } .nextPlayer{ text-align: center; height: 14px; width: 60px; font-size: 0.5rem; } .cell { border-radius: 3px; font-size: 0.8rem; } } @media only screen and (min-width: 991px) and (max-width: 1200px) { body { width: 100%; text-align: justify; } }

    • By Alberto Nascimento
      i("resultado").innerHTML = ((((parseFloat(c1) * parseFloat(c2)) + ... Quando migrei para o servidor 7.2 parou de funcionar
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.