Calculo de Valor restante

Boa tarde, estou tentando usar o código abaixo para calcular a diferença em parcelas, porem não esta somando corretamente

$P = {qtdparcelas};
$PP = $P - 1;
$VPP = $valor * $PP;
$vP = $valor * $P;
$NC = $vP - $VPP;

Exemplo tento dividir R$ 255,00 / 7 seria igual a R$ 36,428, porem se multiplico este valor por 7 dá 254,99 que seria menor que R$ 255,00 então coloquei no $NC para fazer o valor total - a multiplicação, mas mesmo assim os valores não batem.

os colegas saberiam me ajudar?

Já tentou usar round()

Só que para uma melhor aproximação seria interessante o Valor poder ter 4 casas decimais ou
se for fazer um parcelamento criar uma rotina para somar a diferença na de centavos na última parcela ou primeira para poder fechar o valor total do parcelamento.

Precisa calcular o residual e jogar na última parcela ou primeira.

$numParcelas = 7;
$total = 255;
$valorParcela = $total/$numParcelas;
$valorResidual = $total-($valorParcela*$numparcelas);
$calVerificacao = ($valorParcela*($numparcelas-1)) + ($valorParcela+$valorResidual);

if ($calVerificação == $total) { Echo "IT IS OK!")

Não consegui entender sua lógica.

Fiz um echo e ele me apresenta o valor correto usando o Round 36,42, porem ao gravar no banco de dados ele fica em R$ 36,43, sabe me dizer o pq?

Vai na dica do Jailton, ele é muito didático nas explanações !

1 Curtida

Não é questão de lógica e sim de aritmética básica.

Nem sempre o resultado de uma divisão dá números inteiros ou até duas casas decimais (no caso de valores monetários) mesmo com o round.

É preciso calcular o Residual.

“Fiz um echo e ele me apresenta o valor correto usando o Round 36,42, porem ao gravar no banco de dados ele fica em R$ 36,43, sabe me dizer o pq?”

Para ele gravar certo você tem que submeter esta variável antes no round.
$_Valor=round($_Valor,2);

Ai pode usar o $_Valor para gravar no banco que ele vai ficar certo, mas igual
ao Haroldo falou e eu passei em cima você deve calcular o residual a diferença
sobre o Total R$ para poder alocar esses centavinhos em uma parcela para
completar o Total R$ na hora da soma das parcelas.

Só uma observação.

O round na segunda casa decimal pode trazer o valor total a maior ao somar as parcelas do que o valor total real.
supondo valor total = 377,99 em 3 parcelas
377,99 / 3 = 125,99666… (nesse caso uma dízima periódica simples)

round na parcela na segunda casa decimal (ou em qualquer casa decimal nesse caso) o valor da parcela passa a ser: 126,00
x 3 parcelas = 378,00 diferente e maior que o valor original que é 377,99 e residual não pode ser negativo, se não teria outro nome e não residual.

Minha sugestão é passar number_format($valor, 2, “.”) para truncar na segunda casa a parcela e calcular residual, para evitar erros de cálculo.

Pode fazer a mesma conta com 377,00, o resultado ficará distorcido com o round.

Você pode usar (float) na frente da expressão para forçar o resultado em ponto flutuante.

1 Curtida