Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde pessoal, já faz algum tempo que não apareço por aqui, e, hoje depois de quebrar muito a cabeça resolvi pedir a ajuda de vocês.
Estou fazendo um rateio do desconto total de uma venda por produtos, e, o danado do PHP me come 0,02 centavos no valor total do desconto, isto para o exemplo que vou fornecer abaixo.
Neste exemplo estou calculando o valor individual de desconto para cada preço de um Array, a fórmula do rateio está correta.
O problema é que o webservice para onde vou enviar esses dados recebe de 1 em 1 o valor individual de desconto, e esse valor só pode conter 2 casas decimais, e depois ele mesmo faz a soma dos descontos individuais, e tem que bater com o total do desconto informado.
Se eu não limito o número de casas decimais, o somatório dos valores individuais batem com o desconto total (só que o webservice não aceita pois tem 13 casas decimais.
Porém se eu limitar em 2 casas decimais dá essa diferença de 0,02 centavos.
Código para teste
<?php
$totalbruto = "2688,61";//Valor bruto de uma venda
$Desconto = "268,86";//Valor total do desconto
$totalbruto = str_replace(",",".",$totalbruto);
$Desconto = str_replace(",",".",$Desconto);
//Array com 33 preços
$v = array( '135,00' , '36,00' , '56,80' , '35,50' , '21,30' , '71,00' , '21,30' , '35,50' , '21,30' , '71,00' , '71,00' , '35,50' , '70,83' , '70,83' , '70,83' , '70,83' , '70,83' , '70,83' , '135,00' , '135,00' , '66,00' , '26,40' , '26,40' , '66,00' , '66,00' , '39,60' , '39,60' , '39,60' , '36,00' , '435,00' , '435,00' , '70,83' , '36,00' );
$soma1 = 0;
$soma2 = 0;
for($i=0; $i<33; $i++){
$valor = str_replace(",",".",$v[$i]);
$totDesc = ($Desconto/$totalbruto)*$valor; //Este total de descontos só pode conter 2 casas decimais para o meu propósito
$soma1 = $soma1 + $totDesc;//Sem limitar o numero de casas decimais OK!
$soma2 = $soma2 + number_format($totDesc,2,".","");//Quando limito as casas ocorre uma diferença de 2 centavos para menos
//echo "(".$Desconto."/".$totalbruto.")*".$valor." = ".$totDesc."<br>";
}
echo "Total sem mexer nas casas decimais : ".$soma1." Total formatando para 2 casas decimais:".$soma2;
?>
Já tentei varias soluções com float, com intval, inclusive tentei as soluções indicadas em um tópico aqui do forum e nada, alguém já passou por isso, e como solucionou? Qualquer ajuda é bem vinda! Eu agradeço!Carregando comentários...