DIVISAO COM ARREDONDAMENTO DE PARCELAS
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?
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?
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.
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.
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.
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
FFCouto
Primeiro vou converter para c# e depois vou testar
Valeu
Primeiro vou converter para c# e depois vou testar
Valeu
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));
OCELOT, cara funcionou... só uma dúvida... não entendi aquele número 10 na linha pow... porque?
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
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
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