Ir para conteúdo
Fórum Script Brasil
  • 0

Arredondar valores sem deixar diferença no valor final


Michelle Alves

Pergunta

Oi gente boa tarde,

estou precisando de uma consultoria novamente. Como dividir parcelamentos sem dar diferença no valor final ? Pois usando o ROUND eu arredondo o valor, mas dependendo do valor e da quantidade de parcelas vai dar diferença.

E no meu caso, os valores nas TEXTBOX dependem da exatidão desses valores para sem exibidos.

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

Primeiramente Obrigada Jonathan,

Então, usando Round vai acontecer o seguinte:

Eu coloquei um valor fictício: R$ 4,37

esse valor dividido por 2 não dá um valor inteiro. Então o sistema colocou cada TEXTBOX (parcela) por 2,19, arredondando para cima. Porém dessa forma ele passa o valor em 1 centavo. Esse é o problema. Até porque não saberei qual TEXTBOX (parcela) deverá ser arredondado para cima ou para baixo, gostaria que o sistema fizesse esse cálculo para o valor ser exato.

Obrigada

Link para o comentário
Compartilhar em outros sites

  • 0

Então é só não utilizar o round

O problema é que poderia haver uma dízima periódica e iria aparecer um número como "50,6969696969", o que não é nada "amigável"

Recomendo que você aproxime o valor com duas casas decimais e na hora de calcular o total utilize a variável (que não foi arredondada) ao invés do valor da textbox

Link para o comentário
Compartilhar em outros sites

  • 0
Então, não é só retirar o ROUND, no caso de haver um dízimo como você bem citou o resultado vai dar inexato do mesmo jeito. Ai vai dar diferença no valor final.

A diferença no valor final vai ser apenas depois das duas casas decimais

Exemplo:

Parcela1 --> 30.66666... --> Aproxima 30.67 (não modifica a variável, apenas o valor do textbox)

Parcela2 --> 30.66666... --> Aproxima 30.67 (não modifica a variável, apenas o valor do textbox)

Valor Final --> 61.33333... --> Aproxima 61.33

Se você modificasse o valor das variáveis parcela1 e parcela2 na aproximação o resultado seria 61,34 (30.67*2)

Fazendo como eu falei (modificando apenas o valor no textbox e mantendo o valor das variáveis) o resultado é aproximadamente 61.33

Não era isso que você queria ?

Link para o comentário
Compartilhar em outros sites

  • 0

Vou te exemplificar para facilitar o entendimento:

os valores das parcelas são exibidos no TEXT conforme um script posto para te exemplificar;

Exemplo; R$ 4,37 dividido em 4 parcelas deu 1,09 cada parcela, totalizando 4,36

Porém o código abaixo seria se y fosse maior que o X (parcelas) então o valor da parcela seria exibido, mas como deu menor por causa do arredondamento, ele exibiu a parcela, porém ele deveria ficar vazio, pois foram apenas 4 parcelas.

Dim x As Currency

Dim y As Currency

x = TextBox14.Text

y = TextBox6.Text

'PARCELA 5

If y > x * 4 Then

TextBox5.Text = x

Else

TextBox5.Text = ""

End If

Link para o comentário
Compartilhar em outros sites

  • 0
esse valor dividido por 2 não dá um valor inteiro. Então o sistema colocou cada TEXTBOX (parcela) por 2,19, arredondando para cima. Porém dessa forma ele passa o valor em 1 centavo. Esse é o problema. Até porque não saberei qual TEXTBOX (parcela) deverá ser arredondado para cima ou para baixo, gostaria que o sistema fizesse esse cálculo para o valor ser exato.

michelle, na minha opiniao isso não tem muito jeito, se as parcelas vao ter o mesmo valor, vai ter q passar um centavo sim. ou vai ter q ser um centavo a menos. você vai ter q prever isso e ajustar do jeito q você quer. depois de dividir, faca o calculo inverso e veja, se não bater o valor você teria q modificar.

acontece q o cara não pode pagar meio centavo ne.

o valor 4,37, por exemplo, você teria essas tres opcoes:

1 - o cara paga duas parcelas de 2,19 o q da um centavo A MAIS

2 - o cara paga duas parcelas de 2,18 o q da um centavo A MENOS

3 - o cara paga paga uma parcela de 2,19 e otra de 2,18 o q vai dar o valor exato.

se não me engano nas lojas em geral, eles usam essa 3ª opcao ai.

Link para o comentário
Compartilhar em outros sites

  • 0

vai ter q dar um jeito de separar as parcelas.

em vez de usar o textbox então, use um combobox.

ai escreva a parcela em cada item. exemplo 4,37 em 2 parcelas:

1ª parcela - R$ 2,19

2ª parcela - R$ 2,18

ou 4,37 em 4 parcelas:

1ª parcela - R$ 1,10

2ª parcela - R$ 1,09

3ª parcela - R$ 1,09

4ª parcela - R$ 1,09

o q você vai ter fazer é calcular o valor da parcela (divida o valor total pelo numero de parcelas), depois faca o round e multiplique de volta pelo numero de parcelas. subtraia do valor original e você vai ter a diferenca.

so q ai você tem q ver qual vai ser a diferenca, pode ser pra mais ou pra menos e não necessariamente so um centavo (divida 4,37 em 8 parcelas por exemplo).

ai você soma a diferenca nas parcelas pra dar o valor total.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu faço coisa parecida com isso. Vou explicar e postar as linhas de código para ficar mais fácil de entender:

Existe o valor total numa TEXT (TEXTBOX6), eu pego esse valor, e divido ele pela forma de PG que está num combo e o resultado é exibido na TEXTBOX14. Confira:

Private Sub ComboBox3_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

If ComboBox3.Text = Plan5.Range("B5") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("k5")

ElseIf ComboBox3.Text = Plan5.Range("B6") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K6")

ElseIf ComboBox3.Text = Plan5.Range("B7") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K7")

ElseIf ComboBox3.Text = Plan5.Range("B8") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K8")

ElseIf ComboBox3.Text = Plan5.Range("B9") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K9")

ElseIf ComboBox3.Text = Plan5.Range("B10") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K10")

ElseIf ComboBox3.Text = Plan5.Range("B11") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K11")

ElseIf ComboBox3.Text = Plan5.Range("B12") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K12")

ElseIf ComboBox3.Text = Plan5.Range("B13") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K13")

ElseIf ComboBox3.Text = Plan5.Range("B14") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K14")

ElseIf ComboBox3.Text = Plan5.Range("B15") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K15")

ElseIf ComboBox3.Text = Plan5.Range("B16") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K16")

ElseIf ComboBox3.Text = Plan5.Range("B17") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K17")

ElseIf ComboBox3.Text = Plan5.Range("B18") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K18")

ElseIf ComboBox3.Text = Plan5.Range("B19") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K19")

ElseIf ComboBox3.Text = Plan5.Range("B20") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K20")

ElseIf ComboBox3.Text = Plan5.Range("B21") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K21")

ElseIf ComboBox3.Text = Plan5.Range("B22") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K22")

ElseIf ComboBox3.Text = Plan5.Range("B23") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K23")

ElseIf ComboBox3.Text = Plan5.Range("B24") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K24")

ElseIf ComboBox3.Text = Plan5.Range("B25") Then

TextBox14.Text = TextBox6.Text / Plan5.Range("K25")

Else

MsgBox "Data não cadastrada"

Exit Sub

TextBox14 = VBA.Format(TextBox1.Text, "R$ #,##0.00")

End If

End Sub

Depois disso, no objeto MultiPágina eu vou para aba seguinte: E lá dependendo da quantidade do número de parcelas, o valor é exibido nas TEXTBOX.

Private Sub MultiPage1_Change()

Dim x As Currency

Dim y As Currency

x = TextBox14.Text

y = TextBox6.Text

'PARCELA 1

TextBox1.Value = WorksheetFunction.RoundUp(x, 2)

'PARCELA 2

If x < y Then

TextBox2.Value = WorksheetFunction.RoundDown(x, 2)

End If

'PARCELA 3

If y > x * 2 Then

TextBox3.Value = WorksheetFunction.RoundUp(x, 2)

End If

'PARCELA 4

If y > x * 3 Then

TextBox4.Value = WorksheetFunction.RoundDown(x, 2)

Else

TextBox4.Value = ""

End If

'PARCELA 5

If y > x * 4 Then

TextBox5.Value = WorksheetFunction.RoundUp(x, 2)

Else

TextBox5.Value = ""

End If

'PARCELA 6

If y > x * 5 Then

TextBox15.Value = WorksheetFunction.RoundDown(x, 2)

Else

TextBox15.Value = ""

End If

'PARCELA 7

If y > x * 6 Then

TextBox20.Value = WorksheetFunction.RoundUp(x, 2)

Else

TextBox20.Value = ""

End If

'PARCELA 8

If y > x * 7 Then

TextBox22.Value = WorksheetFunction.RoundDown(x, 2)

Else

TextBox22.Value = ""

End If

'PARCELA 9

If y > x * 8 Then

TextBox24.Value = WorksheetFunction.RoundUp(x, 2)

Else

TextBox24.Value = ""

End If

'PARCELA 10

If y > x * 9 Then

TextBox26.Value = WorksheetFunction.RoundDown(x, 2)

Else

TextBox26.Value = ""

End If

'PARCELA 11

If y > x * 10 Then

TextBox28.Value = WorksheetFunction.RoundUp(x, 2)

Else

TextBox28.Value = ""

End If

'PARCELA 12

If y > x * 11 Then

TextBox30.Value = WorksheetFunction.RoundDown(x, 2)

Else

TextBox30.Value = ""

End If

End Sub

Mas como eu copio os valores do TEXTBOX14, todos os parcelamentos no TEXT da MULTIPAGE ficam idênticos. Desse jeito, alguns valores batem certinho, mas nem sempre, tem alguns casos que dão problema. Não tenho como saber quais TEXT devem ter o ROUNDUP ou ROUNDDOWN.... isso varia para cada valor, esse o problema.

Editado por Michelle Alves
Link para o comentário
Compartilhar em outros sites

  • 0

michelle, a conta é meio dificil de fazer, tenta monta o esquema no papel pra ficar mais facil de pensar.

seria mais o menos isso q falei aqui ó:

o q você vai ter fazer é calcular o valor da parcela (divida o valor total pelo numero de parcelas), depois faca o round e multiplique de volta pelo numero de parcelas. subtraia do valor original e você vai ter a diferenca.

so q ai você tem q ver qual vai ser a diferenca, pode ser pra mais ou pra menos e não necessariamente so um centavo (divida 4,37 em 8 parcelas por exemplo).

ai você soma a diferenca nas parcelas pra dar o valor total.

tipo assim, calcule a diferenca:

valor_da_parcela = Round (valor_total / num_parcelas, 2)
diferenca = valor_total - (valor_da_parcela * num_parcelas)[/code] ai se a diferenca der 0 você sabe q não vai ter problema se ela der positivo, você sabe q vai ter q somar nas parcelas pra bater o valor se ela der negativo, você sabe q vat ter q subtrair. ai é a parte dificil. pensei aqui numa solucao sem testar nenhum codigo, mas o q você poderia fazer era um For q fosse percorrendo os textbox somando (ou subtraindo) um centavo. exemplo, você tem uma diferenca de 0,03 (tres centavos) pra 4 parcelas. então faca um for q vai somando um centavo nos textbox e subtraindo um centavo da diferenca. quando a diferenca chegar em 0 não precisa mais somar. acho q ficaria mais facil se você acesar o textbox pelo nome. tipo assim:
[code]Me.Controls("TextBox1").Text = Me.Controls("TextBox1").Text + 0.01
se você não entendeu o q eu quis dizer, abra um userform novo, ponha 3 textbox nele e testa esse codigo aqui:
For i = 1 To 3
    Me.Controls("TextBox" & i).Text = i
Next[/code]

assim você acessa o textbox correspondente a parcela sem ter q fazer um if pra cada um.

so q você teria q mudar os nomes deles, já q pelo q vi no seu codigo, os nomes dos textbox das parcelas não são sequenciais.

então, ve ai se ajuda isso q eu falei, qualquer coisa poste.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...