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 quimera
      O problema seria simples se o script da página permitisse o autopreenchimento usando javascript, masssssssssssss...
      O site em questão não permite que o campo seja preenchido dinamicamente ou seja usando script (ele identifica a digitação do teclado para impedir isso)
      Eles devem usar algo como: onkeypress ou onkeyup e acumular os valores digitados numa variável para dispor isso no post/get
      Por que nesse caso, se foi simplesmente colado ou preenchido via script não vai aceitar já que provavelmente é acumulativo e não verificado se o campo foi preenchido.
      Então como preencher dinamicamente o campo usando javascript nesse caso?
    • By AndersonWS
      Boa tarde, já tentei muitas formas mas não consigo retirar o atributo required.
      O resultado que eu preciso é, quando retiro o required de um (name="posicao") o outro fica com required e vice-versa e também um aparece e outro some.
       
      Segue o código HTML.
      <select name="posicao" class="form-control option_escolhida" style="display:none" id="2" required="" disabled> <option value="" selected>Selecione</option> <option value="1">Espaco</option> <option value="2">Cursos</option> </select> <select name="posicao" class="form-control option_escolhida" style="display:none" id="4" required="" disabled> <option value="" selected>Selecione</option> <option value="4">Políticas de privacidade</option> </select> <div class="sem_option"><code>Sem posição definida</code></div> <div class="ini_option"><code>Posição inicial</code></div> <div class="main_option" style="display:none"> <input name="apelido" class="form-control apelido" placeholder="Nome do grupo" type="text" required="" disabled> </div> Segue o código javascrpt:
      $('.select_escolhida').on({change: listChildren}).trigger('change'); function listChildren() { if ( $(this).val() != '' ) { children = $('option').val(); $(".ini_option").show(); $(".option_escolhida").hide(); $(".option_escolhida").attr("disabled", true); $("#" + $(this).val() ).show(); $("#" + $(this).val() ).removeAttr("disabled"); $(".sem_option").hide(); if( ($(this).val() == '1')||($(this).val() == '3') ){ $(".main_option").show(); $(".apelido").removeAttr("disabled"); } else { $(".main_option").hide(); $(".apelido").attr("disabled", true); $(".ini_option").hide(); } } else { $(".sem_option").show(); $(".ini_option").hide(); $(".apelido").hide(); } }  
    • By dmelo
      Eu tenho um script   $('.btn').click();   mas ele só funciona se eu deixar o mouse em cima do elemento.
      Como fazer pra ele funcionar ignorando a posião do mouse?
      Agradeço muito quem puder me ajudar pois já procurei em vários fóruns mas não achei a solução.
    • By mamotinho
      Olá, estou com problemas, minha data está atualizando porém eu clico em um produto ele exibe o tempo sem atualizar . quando eu mudo de produto ele mostra os dois valores exemplo
      Produto 1: tem duraçao de: 1 dia e 13:023 PM
      Produto 2: tem duraçao de: 0 dia e 23:023 PM

      Quando eu clico no produto 1 ele exibe normalmente, porém quando mudo para o produto 2 ele fica atualizando o valor do dia do produto 1 e do produto 2 sempre mudando.
      segue abaixo como está o codigo

      JavaSCRIPT
       
      function anooo(mes,dia,h,m){ var mess = mes; var dias = dia; var hss = h; var mss = m; // Set the date we're counting down to var countDownDate = new Date(""+mess+" "+dias+", 2020 "+hss+":"+mss+":00").getTime(); // Update the count down every 1 second var x = setInterval(function() { // Get today's date and time var now = new Date().getTime(); // Find the distance between now and the count down date var distance = countDownDate - now; // Time calculations for days, hours, minutes and seconds var dayss = Math.floor(distance / (1000 * 60 * 60 * 24)); var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); var seconds = Math.floor((distance % (1000 * 60)) / 1000); document.getElementById("days").innerHTML = dayss; document.getElementById("hrs").innerHTML = hours; document.getElementById("minus").innerHTML = minutes; document.getElementById("secs").innerHTML = seconds; this.remove(countDownDate); // If the count down is over, write some text if (distance < 0) { clearInterval(x); } }, 1000); } AQUI É O CHAMADO:
       
      <? if($result->Discount>=1){ $Month = date('M', strtotime($result->DateDiscount)); $Days = date('d', strtotime($result->DateDiscount)); $Hours = date('H', strtotime($result->DateDiscount)); $Minutes = date('i', strtotime($result->DateDiscount)); echo "<script>anooo('".$Month."','".$Days."','".$Hours."','".$Minutes."')</script>"; //echo "<script>alert('".$Month."')</script>"; ?> <ul class="time_sell remain_time"> <li> <dl> <dt class="blind">남은시간</dt> <dd> <span class='n_date day' id='days'></span> <span class='date'>일</span> <span class='n_time hour' id='hrs'></span> <span class='n_time minute' id='minus'></span> <span class='n_time second' id='secs'></span> <div id="countdown"></div> </dd> </dl> </li> </ul> <? } ?> eu já tentei de tudo mais sempre que mudo de produto ele exibe a data dos produtos anteriores em loop. a cada atualização do setInterval
    • By WagnerFilho
      Olá,
      Eu escrevi um exemplo de trabalho de um problema real que estou tentando resolver
      Criei um objeto simulando o retorno json que recebo do banco de dados.
       
      Eu preciso:
      Listar contratos e lotes de contratos Ao entrar na função, marcar o último `lote` do `contrato` como selecionado no Dropdown List Ao entrar na função, exibir as faturas `lote` e `contrato` selecionado no elemento `ul-invoices` Carregar e exibir as respectivas `faturas` ao alterar o `lote`  
      Problemas:
      Não consigo listar as `faturas` do último `lote` do `contrato selecionado` ao carregar a função. Não consigo listar as `faturas` ao `alterar` o `lote` do `contrato`  
      Observação:
      Ao entrar na página, já tenho as informações do contrato selecionado; no caso do exemplo, deixei o contrato com o ID 1. No exemplo estou usando a classe `in-attendance` para definir o contrato selecionado Estou usando `Revealing Pattern` e quero manter este padrão  
      Tradução
      contracts = contratos batches = lotes invoices = faturas  
      Exemplo
      <html> <label id="contracts"></label> <ul id="ul-invoices"></ul> <pre></pre> <script> let lblContract = document.querySelector('#contracts'); let UlInvoices = document.querySelector('#ul-invoices'); let contractInAttendance = 1; const objectContract = { id: 1, nome: 'wagner', contracts: [{ id: 1, contract: '123456', batches: [ { id: 1, contract_id: 1, batch: '1', invoices: [ { value: 10, batch_id: 1, }] }, { id: 2, contract_id: 1, batch: '2', invoices: [{ value: 10, batch_id: 2, }] }] }, { id: 2, contract: '246789', batches: [ { id: 3, contract_id: 2, batch: '1', invoices: [ { value: 20, batch_id: 3, }] }] }] } const revelling = (function() { function privateInit() { const contracts = objectContract.contracts; let contractFilteredById = contracts.filter(contract => contract.id === contractInAttendance); for (const contract of contracts) { const selectedContract = contract.id === contractFilteredById[0].id ? 'in-attendance' : ''; let htmlForBatchsOptions = contract.batches.map(batch => `<option value=${batch.id}>${batch.batch}</option>`).join(''); lblContract.innerHTML += `<div class="contract-${selectedContract}" style="display: flex;"> <div id="contract-${contract.contract}" data-contract="${contract.id}" class="loren"> <span>${contract.contract}</span> </div> <div class="ipsulum" style="margin-left: 5px;"> <select class="sel-batch"> ${htmlForBatchsOptions} </select> </div> </div>`; const batchOption = lblContract.querySelector('select.sel-batch'); batchOption.addEventListener('change', getInvoices); //batchOption.value = 2; } } function getInvoices() { const batchValue = event.target.value console.log(batchValue); //console.log(this.value); } return { init: privateInit() } })(); revelling.init; </script> </html>  
×

Important Information

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