Jump to content
11closed

Como somar esses decimais corretamente?

Recommended Posts

Olá estou com dificuldades para fazer essa conta corretamente, para que não aja erros matemático futuros no site.

 

tenho um $valor_total quero dividir ele por 2 e separar no $valor1 e $valor2 sem arredondar e caso aja algum resto na conta, quero somar o resto do $resto_valor1+$resto_valor2 na varaivel $resto e depois finalizar sempre com os valores totais corretamente, veja o exemplo abaixo.

 

$valor_total = 157.75 //valor total

$valor1 = $valor_total/2;   // resultado = 78.875

$valor2 = $valor_total/2;   // resultado = 78.875

 

$resto_valor1 = 0.005

$resto_valor2 = 0.005

 

$resto = $resto_valor1+$resto_valor2; // resultado 0.01

 

// para finalizar quero que as variaveis me retornam sempre os valores corretamente

 

$valor1 = 78.87

$valor2 = 78.87

$resto_total = 0.01

 

Sendo que a soma dos valores $valor1+$valor2+$resto_total tem que ser idêntico ao $valor_total = 157.75 para que não aja erros futuros na matematica, alguem poderia me ajudar a fazer isso no PHP, tentei de varias formas mais não estou conseguindo 

Share this post


Link to post
Share on other sites

Olá!

Você tem dois caminhos:

 

1 - Utilizar a biblioteca nativa BC Math, como neste exemplo: https://forum.imasters.com.br/topic/581601-arredondar-valor-0444444-para-045/?tab=comments#comment-2276243

 

2 - Considerar a unidade como centavo (ou fração de centavo) e não como real. As maiores instituições financeiras fazem dessa forma. Exemplo: 1500 para representar R$15,00.

Caso você precise de maior precisão, basta utilizar mais casas.

 

 

 

Share this post


Link to post
Share on other sites

Boa Tarde, não consegui fazer dos jeito que você mencionou, então usei o explode(), veja como ficou

 

$valor_total = '157.75'; 
$divide_total = $valor_total/2;  
  
echo $divide_total."<br>"; // resultado = 78.875   

$explode = explode('.', $divide_total); 
$result = $explode[1]; 
print_r($result);   // resultado = 875
echo "<br>";   
  
$arr = str_split($result, 2);
for ($i=1;$i<count($arr);$i++) {
	$resto_total .= $arr[$i];
}

$resto_total_1 = "0.00".$resto_total; // 0.005
$total_final_1 = $divide_total-$resto_total_1; // 78.875-0.005

$resto_total2 = "0.00".$resto_total; // 0.005
$resto_total2 = $resto_total2*2; // 0.005*2

$soma_valores = $resto_total2+($total_final_1*2); // 0.01+(78.87*2)

echo "resto = ". $resto_total2."<br>"; // resto = 0.01  
echo "valor 1 = ". $total_final_1."<br>"; // 78.87
echo "valor 2 = ". $total_final_1."<br>";// 78.87
echo "valor total = ". $soma_valores."<br>";// 157.75

creio que ficou correto, mas melhor pedir ajuda aos universitário né kkk.. será que terei algum problema futuro com esse codigo? ou realmente está correto a matematica? 

 

Outro detalhe, como faço para verificar se $resto_total2 está vazio ou não, fiz um teste aqui dessa forma

if ($resto_total2 > 0.0099999999999999999999999999999999999999999999999999999999999999999999999){
	echo "SIM";
}

nesse teste não está aparecendo a mensagem "SIM" e deveria estar né, pois o valor da $resto_total2 é maior

Share this post


Link to post
Share on other sites

Bom quanto a ultima duvida, para quem quiser saber aí, acrescentei assim

 

for ($i=1;$i<count($arr);$i++) {
	$resto_total .= $arr[$i];
}

$resto_sem_zero = intval($resto_total); //retirei todos os possiveis 0 da esquerda
                               
if ($resto_sem_zero > 0){
 	// tem resto 
} else {
	// não tem resto
}

creio que dessa forma não terei problemas futuros, se alguem descorda, por favor me dê um feedback, 

Obrigado

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 violin101
      Caros amigos
       
      saudações...
       
      Peço desculpa, se postei minha dúvida em local errado.
       
      Tenho um formulário onde valido todos os campos e após clicar no BUTTON para adicionar, tenho uma função que muda o TITLE e deixa desabilitado.
       
      O problema é o seguinte:
      - caso algum campo fica em branco, após validar o formulário e mudar o BUTTON, não consigo depois de preenchido HABILITAR novamente o button.
       
      Observação:
      1) após preencher o campo que ficou em branco, como faço para HABILITAR o button novamente e mudar o title do button ?
       
       
      na VIEW está assim:
      <form action="<?php echo current_url(); ?>" id="frmEstoque" method="post" onsubmit="this.btn_adc.disabled=true;" > <div class="card-body"> <div class="row"> <!---Todos os campos do Formulário---> </div> </div> <div class="card-footer" style="text-align:center;"> <input type="hidden" id="idCli" name="idCli" value="<?php echo $cliente->idClientes; ?>" /> <a href="<?php echo base_url() ?>admin/estoque" id="" class="btn btn-danger"><i class="fa fa-undo"></i> Voltar</a> &nbsp; <button type="submit" id="btn_adc" name="btn_adc" class="btn btn-primary">Adicionar</button> </div> </form>  
      na JavaScript está assim:
      <script> //Função para Mudar o VALUE do Button Adicionar Veículo document.getElementById("btn_adc").addEventListener("click",function(){ this.innerHTML = this.value++ || 'Aguarde...'; },false); </script> /* Observação: 1) como removo a função acima, após validar o formulário e esse encontrar algum campo vazio. 2) após preencher o campo que ficou em branco, HABILITAR o button novamente. */ <script type="text/javascript"> $(document).ready(function(){ //Função para Validar Formulário $('#frmEstoque').validate({ rules :{ etq_categcars:{ required: true}, etq_destaq:{ required: true}, etq_status:{ required: true} }, messages:{ etq_categcars :{ required: '<span style="color:#ff0000;">Campo Requerido</span>'}, etq_destaq :{ required: '<span style="color:#ff0000;">Campo Requerido</span>'}, etq_status :{ required: '<span style="color:#ff0000;">Campo Requerido</span>'} }, errorClass: "help-inline", errorElement: "span", highlight:function(element, errorClass, validClass) { $(element).parents('.form-group').addClass('error'); }, unhighlight: function(element, errorClass, validClass) { $(element).parents('.form-group').removeClass('error'); $(element).parents('.form-group').addClass('success'); } }); //Status dos Botões ADICIONAR - iniciar como desabilitado. document.getElementById("btn_adc").disabled = true; }); function statusButton(){ //valida conteudo do input if ($("input[name=etq_vlrcpr]").val() != 0 && $("input[name=etq_vlrvda]").val() != 0) { //habilita o botão document.getElementById("btn_adc").disabled = false; } else { //desabilita o botão se o conteúdo do input ficar em branco document.getElementById("btn_adc").disabled = true; } } </script>  
      Grato,
       
      Cesar
       
       
       
       
    • By mateus.andriollo
      Olá,
      Gostaria de saber se alguem pode me ajudar.
      Meu PHP esta na pasta public_html em um CPanel, quero saber se é possível armazenar em pasta fora da pasta  pública, por segurança mesmo...
      Faço isso em ASP, ai chamo a imagem por um fso, funciona mas queria saber se tem como no PHP.
    • By Joob
      Boas Malta,
       
      Não sei porquê que não estou a conseguir remover os ficheiros após minutos..
      Por exemplo ele vai buscar o delete_expired_shared_links e apaga a partilha feita após o tempo colocado, mas no delete_old_zips já não apaga.
      Supostamente ele vai buscar os ficheiros da pasta zip e deveria apagar.
       
      protected function schedule(Schedule $schedule) { $schedule->call(function () { $this->delete_expired_shared_links(); })->everyMinute(); $schedule->call(function () { $this->delete_old_zips(); })->everyFiveMinutes(); // Run queue jobs every minute $schedule->command('queue:work --stop-when-empty') ->everyMinute() ->withoutOverlapping(); } protected function delete_old_zips(): void { $zips = Zip::where('created_at', '<=', Carbon::now()->subDay()->toDateTimeString())->get(); $zips->each(function ($zip) { \Storage::disk('local')->delete('zip/' . $zip->basename); $zip->delete(); }); } protected function delete_expired_shared_links(): void { $shares = Share::whereNotNull('expire_in')->get(); $shares->each(function ($share) { $created_at = Carbon::parse($share->created_at); if ($created_at->diffInHours(Carbon::now()) >= $share->expire_in) { $share->delete(); } }); } }  
      Obrigado :)
    • By clayton.lima2020
      Boa Tarde!
       
      Pessoal estou com um problema para resolver:
       
      Tenho um uma string que é um Nome:  SYLVIA
       
      Eu preciso fazer uma uma busca nessa string achar a letra Y e depois verificar se após a letra Y a próxima letra é Vogal ou Consoante.
       
      No caso do nome SYLVIA a próxima letra é L então retorna Consoante.
       
      Alguém sabe montar esse algoritmo ai?
    • By Duilio Gomes Pereira
      Tenho um banco de dados com mais de 21 mil usuários do wordpress. Como faço para deletar os usuário no  Phpmyadmin e deixar apenas 2 usuários?
       
      Pois só preciso de 2 usuários neste site.
       
      Obrigado!
×

Important Information

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