DIVISAO COM ARREDONDAMENTO DE PARCELAS

ALEXPASSOS 28/04/2013 09:42:31
#422626
Olá,

Estou precisando fazer um arredondamento das parcelas exemplo:

100 / 3 = 33,33 (vai gerar 3 parcelas de 33,33)
e se fizer 33,33 x 3 = 99,99 (que é diferente de 100)

Estou precisando que fique assim:
33,33 + 33,33 + 33,34 = 100

Outro exemplo:
50 / 3 = 16,66
16,66 * 3 = 49,98
Tem que ficar assim:
16,66 + 16,66 + 16,68 = 50

Tem como fazer isso?
NETMANIA 28/04/2013 12:44:08
#422630
Você pode usar o comando round (arredondamento) e definir que você vai usar duas casas decimais.

Fiz uma simulação no Excel usando a conta 50 / 3. Se não for usar o arrendodamento, este volta 16,666667, mas depois que ativei o arrendodamento para duas casas, ele voltou o valor de 16,67, quando você multiplica o valor por 3 (seguindo o seu exemplo) este volta para o valor de 50.
ALEXPASSOS 28/04/2013 14:58:47
#422633
Netmania... da não cara... eu fiz aqui na calculadora 16,67 x 3 = 50,01 ai se o cliente for calcular vai dizer que a empresa esta roubando.
FFCOUTO 28/04/2013 15:21:34
#422634
Tente isto


Sub CalcularParcelas(ByVal ValorPrincipal As Currency, ByVal NroParcelas As Integer, ByRef Parcelas() As Currency)
[ô]Declara as variáveis
Dim i As Integer
Dim vlr As Currency
Dim dif As Integer, totParc As Currency

[ô]Cria a lista de parcelas
ReDim Parcelas(1 To NroParcelas)

[ô]Calcula o valor de cada parcela
vlr = ValorPrincipal / NroParcelas

[ô]Recupera somente as 2 casas decimais após a vírgula
vlr = ArredondarMoeda(vlr)

[ô]Totaliza o das parcelas
totParc = vlr * NroParcelas

[ô]Atribui o valor na lista de parcelas
For i = 1 To NroParcelas
Parcelas(i) = vlr
Next

[ô]Verifica a diferença entre o valor principal e total das parcelas
dif = Format((ValorPrincipal - totParc) * 100, [Ô]#0.00[Ô])

[ô]Este cálculo permite redividir as parcelas quando a
[ô]divisão não é exata e retorna alguns centavos de diferença
[ô]esta rotina, soma ou deduz R$ 0,01 para ajustar o valor
[ô]das parcelas para que a soma delas seja igual ao valor
[ô]principal

[ô]Executa o número de vezes da diferença obtida
For i = 1 To dif
[ô]Verifica se a soma das parcelas é maior que o valor principal
[ô]Neste caso, deduz R$ 0,01 de cada parcela
If totParc > ValorPrincipal Then
Parcelas(i) = Parcelas(i) - 0.01

[ô]A soma das parcels é menor que o valor principal
[ô]Neste caso, soma R$ 0,01 para cada parcela
Else
Parcelas(i) = Parcelas(i) + 0.01

End If
Next
End Sub

Public Function ArredondarMoeda(ByVal Valor As Currency) As Currency
Dim iPos As Integer [ô]Declara as variáveis

[ô]Verifica qual a posição da vírgula dentro da variável
iPos = InStr(1, CStr(Valor), [Ô],[Ô])
[ô]Se não há vígula o número é inteiro, então a posição é o tamanho da string
If iPos = 0 Then iPos = Len(CStr(Valor))
[ô]Retorna o número até a segunda casa decimal
ArredondarMoeda = CCur(Mid(CStr(Valor), 1, iPos + 2))
End Function

Private Sub Command1_Click()
Dim i As Integer
Dim rParc() As Currency

CalcularParcelas 50, 3, rParc

For i = LBound(rParc) To UBound(rParc)
Debug.Print [Ô]Parcela [Ô] & i & [Ô]: [Ô], rParc(i)
Next
End Sub
ALEXPASSOS 28/04/2013 16:24:01
#422635
FFCouto

Primeiro vou converter para c# e depois vou testar

Valeu
OCELOT 28/04/2013 17:56:54
#422638
Resposta escolhida
Eu faria assim:
decimal valor = 100;
int parcelas = 3;
int quantidadeDeDecimais = 2;

//divide sempre arredondando para baixo
decimal pow = (decimal)Math.Pow( 10, quantidadeDeDecimais );
decimal valorParcelas = Math.Truncate( valor / parcelas * pow ) / pow;
//pega o valor da ultima parcela
decimal valorUltimaParcela = valor - (valorParcelas * (parcelas - 1));
ALEXPASSOS 28/04/2013 22:00:49
#422645
OCELOT, cara funcionou... só uma dúvida... não entendi aquele número 10 na linha pow... porque?
OCELOT 29/04/2013 09:51:07
#422658
Funciona assim, a função para arredondar o valor que tem no .Net não tem opção para arredondar sempre para baixo, então a gente pega o valor e multiplica no caso por 100 e usa o truncate para remover todas as casas decimais, terminando por dividir por 100 de novo.

No código isso ta dinâmico, pode ter quantas casas decimais quiser e por isso o 10 no pow, é sempre 10 elevado ao numero de casas decimais que você precisa, assim se forem duas casas decimais o valor do pow vai ser 100, se forem 3 vai ser 1000 e assim por diante.

Por exemplo, digamos que o valor total seja 100 em 3 parcelas

100 / 3 = 33,33333333333....

Para arredondar isso a gente faz assim, primeiro faço 10 elevado ao número de casas decimais, no caso é

decimal pow = (decimal)Math.Pow( 10, quantidadeDeDecimais );

equivale ao calculo (onde ^ significa elevado a potencia)

10 ^ 2 = 100

então na variavel pow vamos ter o valor 100, dai a gente faz valor / parcelas * pow

100 / 3 * 100 = 33,333333... * 100 = 3333,3333....

Chegando nesse valor de 3333,33333 a gente usa o truncate e ele vai retornar 3333 sem nenhuma casa decimal, então a gente divide novamente por pow (que é 100) e fica com o valor 33,33 que é o que a gente quer

NETMANIA 29/04/2013 10:29:33
#422662
No Excel não ocorreu este problema. Você tentou fazer uma experiência com o C#?
Tópico encerrado , respostas não são mais permitidas