Ir para conteúdo
biakelly

[Resolvido] Calculo entre duas variáveis

Recommended Posts

Oi pessoal, as vezes me pergunto, será que o óbvio é de fato obvio?

 

Não sou loira mas tem algo errado:

 

$precototal = "$precounitario * $totalemitido";

Nos valores recuperados tenho tenho:

precototal: 0.002822102460892938

totalemitido: 10,454,760.506412

 

Perceba que ambos numeros estão em formato USD

 

O que eu esperava era o resultado: 29,503.334149

 

O que recebo?: 0.0002822

 

Será macumba ou estou longe de acertar com a formula proposta?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi, olha eu aqui novamente, persistência é o caminho

 

Até consegui resolver, creio que isso é uma gambiarra:

 

var_dump(
    number_format(
        (
            ($price = str_replace(array('.', ','), '', $price)) *
            ($csupply = str_replace(array('.', ','), '', $csupply)) / 1000000000000000000000000),
        6,
        '.',
        ','
    )
);

Será possível deixar menos feio isso?

 

Primeiro tive que retirar todos os pontos e virgulas pois de onde recupero ele ja possui o formato ideal, mas para este calculo é necessário retirar.

 

Ok, após retirar, preciso novamente incluir os pontos e virgulas, como o numero fica extremamente gigante preciso reduzi-lo realizado uma divisão, porem ainda acho que não é amaneira correta.

 

Alguma idéia este sentido será bem vinda

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @biakelly, você está quase lá...

 

1 - Precisa retirar as vírgulas, os pontos representam os decimais e precisam estar na conta. Portanto:

// Primeiro retiramos a vírgula com o str_replace.
// O (float) força o tipo de variável a ser um float, ou seja, número com decimais.
// Se price fosse originalmente '424,123.123', isso significa que era uma string
// com vírgulas representando os milhares.
$price = (float)str_replace( ',', '', $price);// Agora passaria a ser 424123.123

Você faz o mesmo com a outra variável, multiplica uma pela outra e aplica o number_format.

Não precisa da divisão por 10000000000...

 

O único problema é que como são números muito grandes, talvez você precise de uma biblioteca para lidar com a precisão dessa matemática, como fiz naquele exemplo da soma da API, para você, sabe?

 

Nesse caso a matemática seria algo assim:

<?php
$precototal = '0.002822102460892938';
$totalemitido = '10,454,760.506412';

$precototal = str_replace( ',', '', $precototal );
$totalemitido = str_replace( ',', '', $totalemitido );

echo $precototal . "\n";
echo $totalemitido . "\n";

echo bcmul( $precototal, $totalemitido, 10 );

Resultado:

0.002822102460892938
10454760.506412
29504.4053531916

E agora vem o number_format para colocar esse produto no padrão brasileiro, ou outro desejado, mas o resultado do cálculo é essa terceira linha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Matheus Tavares 

 

 

13 minutos atrás, Matheus Tavares disse:

O único problema é que como são números muito grandes, talvez você precise de uma biblioteca para lidar com a precisão dessa matemática, como fiz naquele exemplo da soma da API, para você, sabe?

Sim é verdade, achei qeu eu tinha que tratar antes, mas como achei o numero muito grande pensei que estivesse no caminho mas faltando algo.

 

Eu realmente estou pegando uns problemas para resolver, meio incorreto mas seguindo teus conselhos

 

Ainda vou chegar próximo a este nível kk que vergonha do meu código kkkk

16 minutos atrás, Matheus Tavares disse:

echo bcmul( $precototal, $totalemitido, 10 );

 

Muito obrigada viu, como diz uma tia minha: Persista até aprender kkk

Compartilhar este post


Link para o post
Compartilhar em outros sites
29 minutos atrás, biakelly disse:

Ainda vou chegar próximo a este nível kk que vergonha do meu código kkkk

Imagina, @biakelly, ninguém nasce sabendo. :P

 

Lembrando que bcmul é apenas uma multiplicação como qualquer outra, com duas diferenças-chave:

1 - Ele vai permitir definir a escala, ou seja, quantos dígitos eu gostaria de visualizar. Exemplo:

<?php
$precototal = '0.002822102460892938';
$totalemitido = '10,454,760.506412';

$precototal = str_replace( ',', '', $precototal );
$totalemitido = str_replace( ',', '', $totalemitido );

echo $precototal * $totalemitido;
echo "\n";
echo bcmul( $precototal, $totalemitido, 25 );

Saída:

29504.405353192
29504.4053531916039105945184560

 

2 - Ele vai ser mais preciso do que as operações comuns. https://www.php.net/manual/pt_BR/language.types.float.php

https://www.leaseweb.com/labs/2013/06/the-php-floating-point-precision-is-wrong-by-default/

 

Principalmente falando de dinheiro, você sempre vai querer utilizar funções com precisão, como as da biblioteca BCMath ou gmp.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Giovanird
      Tenho uma tabela com a coluna média (valor decimal) .
       
      cod | media | cod_sala 1 1,98 5 2 2,34 2 3 1,32 5 4 2,51 3 5 1,65 1 6 2,78 5 7 4,95 4 8 0,75 4 9 1,23 1 10 1,63 2 11 1,55 3 Preciso no select MYSQL ou dentro do foreach multiplicar os valores do campo média, de acordo com o fitro por cod_sala
      Exemplo pelo cod_sala: 5
      Sendo o resultdo final: 1,98 * 1,32 * 2,78 = 7,26

      Desde já agradeço!
    • Por fabionps
      Pessoal meu professor da faculdade passou trabalho para fazer um programa pra fazer uma calculadora de produto e divisão no python. A pessoa escolhe o que ela vai fazer e depois escolher dois números inteiros.
      OBS.: Não pode usar nenhum comando de laço e só pode usar os operadores aritméticos  +  e/ou  -  
      Não pode usar  *  nem  / 
    • Por Gilson Rodrigues
      A coluna especificação e valor são puxadas pelo banco, bem como o saldo.
      A única coisa que deve ser digitada é o pedido, que deverá ser multiplicado pela quantidade e no campo Valor a multiplicação.
       
       

      Especificação
      Valor Unit
      Saldo
      Pedido
      Valor
      ACHOCOLATADO EM PÓ INSTANTÂNEO
      R$ 5,00
      6.000 KG

       

       
      ALMÔNDEGA ASSADA CONGELADA DE BOVINO
      R$ 19,68
      1.000 KG

       
       
      Problema é que com o código que tenho o cálculo é feito apenas no primeiro item. Não sei como deixar fixo para todos os itens.
       
       
       
      ===
       
       
      <table width="100%" border="1" align="center" cellpadding="0" cellspacing="0">
      <tr>
       
      <td width="58%"> <div align="center"><font color="#666666" size="2" face="Tahoma">Especificação</font></div></td>
      <td width="10%"> <div align="center"><font color="#666666" size="2" face="Tahoma">Valor Unit</font></div></td>
      <td width="10%"> <div align="center"><font color="#666666" size="2" face="Tahoma">Saldo</font></div></td>
      <td width="12%"> <div align="center"><font color="#666666" size="2" face="Tahoma">Pedido</font></div></td>
      <td width="10%"> <div align="center"><font color="#666666" size="2" face="Tahoma">Valor</font></div></td>
       
      </table>
       
       
       
       
       
      <?php
      while($row=mysql_fetch_object($resultado)) {
      $nome = $row->user_nome; ?>
       
       
       
       
      <script type="text/javascript">
      function id(el) {
      return document.getElementById( el );
      }
      function total( un, qnt ) {
      return parseFloat(un.replace(',', '.'), 10) * parseFloat(qnt.replace(',', '.'), 10);
      }
      window.onload = function() {
      id('valor_unitario').addEventListener('keyup', function() {
      var result = total( this.value , id('qnt').value );
      id('total').value = String(result.toFixed(2)).formatMoney();
      });
       
      id('qnt').addEventListener('keyup', function(){
      var result = total( id('valor_unitario').value , this.value );
      id('total').value = String(result.toFixed(2)).formatMoney();
      });
      }
       
      String.prototype.formatMoney = function() {
      var v = this;
       
      if(v.indexOf('.') === -1) {
      v = v.replace(/([\d]+)/, "$1,00");
      }
       
      v = v.replace(/([\d]+)\.([\d]{1})$/, "$1,$20");
      v = v.replace(/([\d]+)\.([\d]{2})$/, "$1,$2");
      v = v.replace(/([\d]+)([\d]{3}),([\d]{2})$/, "$1.$2,$3");
       
      return v;
      };
      </script>
       
       
       
       
       
       
       
       
       
      <table width="100%" border="1" align="center" cellpadding="0" cellspacing="0">
      <tr>
      <td width="60%"> <div align="center"><font size="2" face="Tahoma"><a href="produtos_ficha.php?codigo=<?php print $row->codigo ?>"><?php print $row->especificacao; ?></a></font></div></td>
      <td width="10%"> <div align="center"><font size="2" face="Tahoma">R$ <?php echo number_format($row->unitario,2,",","."); ?> <input name="valor_unitario" type="hidden" id="valor_unitario" value="<?php echo number_format($row->unitario,2,",","."); ?>" size="50" maxlength="50"> </font></div></td>
      <td width="10%"> <div align="center"><font size="2" face="Tahoma"><?php echo number_format($row->quantidade,0,",","."); ?> <?php print $row->unidade; ?></font></div></td>
      <td width="10%"> <div align="center"><font color="#666666" size="2" face="Tahoma"><input name="qnt" type="text" id="qnt" onkeyup="up(this)" value="" size="8" maxlength="8"></font></div></td>
      <td width="10%"> <div align="center"><font color="#666666" size="2" face="Tahoma"><input name="total" type="text" id="total" onkeyup="up(this)" value="" size="5" maxlength="5" readonly="readonly" disabled="true"></font></div></td>
      </tr>
      </table>
       
       
      <?php }
      endif;?>
       
       
       
       
       
      Por favor, alguém em ajude.
    • Por chrislix
      Alguem poderia me ajudar?
      estou tentando multiplicar duas matrizes, A e B
      e salvar o resultado em C
      o resultado nao ta certo, to usando thread
      so queria uma opinião para saber se ta certo o que to fazendo, pq o que ta me intrigando eh que os valores da linha da matriz C nao altera
      #include<stdio.h> #include<stdlib.h> #include<pthread.h> pthread_t thread_1; pthread_t thread_2; pthread_t thread_3; int a[3][2] = {{1, 4}, {2, 5}, {3, 6}}; int b[2][3] = {{7, 8, 9}, {10, 11, 12}}; int c[3][3] = {{1, 2, 3}, {0, 0, 0}, {0, 0, 0}}; void* tarefa_1(void *p) { printf("\nThread1\n"); for (int col = 0; col < 3; col++) { // Multiplica a linha de A pela coluna de B. for (int i = 0; i < 2; i++) { c[1][col] += a[1][i] * b[i][col]; } printf("%i\t",c[1][col]); printf("\n"); } } void* tarefa_2(void *p) { printf("\nThread2\n"); for (int col = 0; col < 3; col++) { // Multiplica a linha de A pela coluna de B. for (int i = 0; i < 2; i++) { c[2][col] += a[2][i] * b[i][col]; } printf("%i\t",c[2][col]); printf("\n"); } } void* tarefa_3(void *p) { printf("\nThread3\n"); for (int col = 0; col < 3; col++) { // Multiplica a linha de A pela coluna de B. for (int i = 0; i < 2; i++) { c[3][col] += a[3][i] * b[i][col]; } printf("%i\t",c[3][col]); printf("\n"); } } int main() { printf("Inicio das Threads...\n"); // inicia as duas threads, passando como parametroa thread e a função que cada uma deve executar pthread_create(&thread_1, NULL, tarefa_1, NULL); pthread_create(&thread_2, NULL, tarefa_2, NULL); pthread_create(&thread_3, NULL, tarefa_3, NULL); // faz com que a thread principal espere a thread 1,2,3 acabarem; pthread_join(thread_1, NULL); pthread_join(thread_2, NULL); pthread_join(thread_3, NULL); printf("resultado da tabela 3\n"); for(int i = 0;i<3; i++){ for(int j= 0; j<3;j++){ printf("%i\t ",c[i][j]); } printf("\n"); } exit(0); }
    • Por jardeldint
      Olá pessoal, tudo bem?
       
      Procurei no fórum, não não achei o que eu estou precisando.. A minha dúvida é a seguinte!
       
      Primeiro quero dizer que não sei quase (pra não dizer nada) de php. To apenas tentando entender esse mundo show da programação. Más gosto de "fuçar" nos códigos.
       
      Tenho um sistema feito em php + codeigneter, onde tem uma área de edição de OS (Ordem de serviços), na aba produtos tem os campos comuns, que são: Descrição, Quantidade e Subtotal e no final da table tem o total.
      Na aba serviços, tem apenas descrição e o botão adicionar.
       
      Eu preciso inserir nessa aba, o campo Quantidade, para que possa multiplicar o básico que é o valor (que é puxado do BD) pela quantidade, como por exemplo, um dos serviços é a Hora Técnica.
       
      Abaixo tem o código original e o que eu tentei modificar (e deu errado):
       
      ORIGINAL:
      <tbody> <?php $total = 0; foreach ($servicos as $s) { $preco = $s->preco; $total = $total + $preco; echo '<tr>'; echo '<td>'.$s->nome.'</td>'; echo '<td><span idAcao="'.$s->idServicos_os.'" title="Excluir Serviço" class="btn btn-danger"><i class="icon-remove icon-white"></i></span></td>'; echo '<td>R$ '.number_format($s->preco,2,',','.').'</td>'; echo '</tr>'; }?> <tr> <td colspan="2" style="text-align: right"><strong>Total:</strong></td> <td><strong>R$ <?php echo number_format($total,2,',','.');?><input type="hidden" id="total-servico" value="<?php echo number_format($total,2); ?>"></strong></td> </tr> </tbody> O MODIFICADO:
      <tbody> <?php $total = 0; foreach ($servicos as $s) { $preco = $s->preco; $total = $total + $s->subTotal; echo '<tr>'; echo '<td>'.$s->descricao.'</td>'; echo '<td>'.$s->quantidade.'</td>'; echo '<td><a href="" idAcao="'.$s->idServicos_os.'" servAcao="'.$s->idServicos.'" quantAcao="'.$s->quantidade.'" title="Excluir Produto" class="btn btn-danger"><i class="icon-remove icon-white"></i></a></td>'; echo '<td>R$ '.number_format($s->subTotal,2,',','.').'</td>'; echo '</tr>'; }?> <tr> <td colspan="3" style="text-align: right"><strong>Total:</strong></td> <td><strong>R$ <?php echo number_format($total,2,',','.');?><input type="hidden" id="total-venda" value="<?php echo number_format($total,2); ?>"></strong></td> </tr> </tbody> No HTML da parte dos serviços, inseri exatamente como está em produtos (apenas alterando as variáveis), como está abaixo:
      <div class="span12 well" style="padding: 1%; margin-left: 0"> <form id="formServicos" action="<?php echo base_url() ?>index.php/os/adicionarServico" method="post"> <div class="span8"> <input type="hidden" name="idServico" id="idServico" /> <input type="hidden" name="idOsServico" id="idOsServico" value="<?php echo $result->idOs?>" /> <input type="hidden" name="preco" id="preco" value=""/> <label for="">Serviço</label> <input type="text" class="span12" name="servico" id="servico" placeholder="Digite o nome do Serviço" /> </div> <div class="span2"> <label for="">Quantidade</label> <input type="text" placeholder="Quantidade" id="quantidade" name="quantidade" class="span12" /> </div> <div class="span2"> <label for="">.</label> <button class="btn btn-success span12" id="servico"><i class="icon-white icon-plus"></i> Adicionar</button> </div> </form> </div> Más a bronca é que está dando esse erro:
       
      A PHP Error was encounteredSeverity: Notice
      Message: Undefined property: stdClass::$quantidade
      Filename: os/editarOs.php
      Line Number: 239
      A PHP Error was encounteredSeverity: Notice
      Message: Undefined property: stdClass::$quantidade
      Filename: os/editarOs.php
      Line Number: 240
      Isso na página de edição da OS.
       
      Alguém pode me ajudar a resolver essa bronca?
       
      Fico no aguardo!
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.