Problema matemático

10 respostas
Planc

Bom dia, estou com um problema envolvendo matemática onde não consigo mais resolver.

Levando em conta que:

  • Composições: são serviços, por exemplo tenho uma composição chamada Janela de Madeira e esta composição é formada por Madeira, Vidro, e um Pedreiro que irá fixar a janela no local especificado. Uma composição pode ter várias sub-composições.

Temos o seguinte:
ver imagem anexa Sem título.png

Preciso separar os itens da composição por tipo de material.
Por exemplo:

  • Tenho a maderia no valor de 15,85 que será multiplicada por 0,714 (15,85 * 0,714 = 11,3169) que por sua vez será multiplicada por 130, ficando = 1471,197
  • Tenho o vidro no valor de 4,20 que será multiplicada por 0,714 (4,20 * 0,714 = 2,9988 ) que por sua vez será multiplicada por 130, ficando = 389,844

Somando os dois resultados 1471,197 + 389,844 = 1861,041

Agora se truncar o valor da primeira multiplicação e fizermos:

15,85 * 0,714 = 11,3169 que fica 11,31 * 130 = 1470,30
4,20 * 0,714 = 2,9988 que fica 2,99 * 130 = 388,70

Somando os dois resultados 1470,30 + 388,70 = 1859

Conclusão: O resultado na imagem anexa nos mostra que o valor de 1860,30 é correto (levando-se em conta que estou sempre truncando os valores), enquanto que ao separar os itens tenho dois valores distintos. Alguém se habilita a dar um palpite ??

10 Respostas

Rafael_Guerreiro

Você está trabalhando com BigDecimal?

Eu não truncaria os valores antes, mas arredondaria somente o valor final.

Planc

Você está trabalhando com BigDecimal?

Eu não truncaria os valores antes, mas arredondaria somente o valor final.

Boa tarde Rafael Guerreiro.

Então, estou trabalhando com BigDecimal. No sistema o usuário pode configurar quantidade de casas decimais para valores e quantidades, pode também configurar se ele quer os valores exatos, arredondados ou truncados.

No caso que demonstrei ficaria assim:

Arredondamento com 2 casas decimais:
Madeira (0,714 * 15,85 = 11,3169) = 11,32

Exato (neste caso sempre leva-se em conta 8 casas decimais):
Madeira (0,714 * 15,85 = 11,3169) = 11,3169

Truncado com 2 casas decimais:
Madeira (0,714 * 15,85 = 11,3169) = 11,31

Rafael_Guerreiro

Ainda assim você pode usar o BigDecimal, pois ele tem o setScale, aonde você define a quantidade de casas decimais, tem o round e é possível truncar.

A vantagem do BigDecimal é que ele vai fazer a conta certo.

Eu faria assim:

"Agora se truncar o valor da primeira multiplicação e fizermos:

15,85 * 0,714 = 11,3169 que fica 11,3169 * 130 = 1471,19 (trunquei só o resultado final)
4,20 * 0,714 = 2,9988 que fica 2,9988 * 130 = 389,84 (trunquei só o resultado final)

Somando os dois resultados 1471,19 + 389,84 = 1861,03"

Planc

O problema é que não posso truncar somente o resultado final de cada multiplicação se eu afirmar que o total geral é 1860,3. Conforme a imagem anexa no primeiro post deste tópico:

Sub-Composição Janela de Madeira 0,714 * 20,05 = 14,3157 (neste momento já sou obrigado a truncar o valor e exibir para o usuário que o total desta sub-composição é 14,31)

então:

130 * 14,31 = 1860,3

Depois do que você falou estou pensando que talvez a solução seja exibir ao usuário que o valor da sub-composição seja 14,3157, e sempre truncar somente o resultado final.

Rafael_Guerreiro

E se você informar para o usuário o valor truncado mas usar sempre o valor exato para calcular.

Ou seja, você só trunca o que vai ser exibido.

Planc

E se você informar para o usuário o valor truncado mas usar sempre o valor exato para calcular.

Ou seja, você só trunca o que vai ser exibido.

Também não dá hehe … eu estaria dizendo para o usuário que 130 * 14,31 é igual a 1861,04

Rafael_Guerreiro

Eu não vejo outra saída, uma vez que 1471,197 é diferente de 1471,19

Rafael_Guerreiro

Outra solução: conversa com o seu usuário e veja como o processo é feito hoje. Se ele trunca antes, se ele trunca depois… E faça igual.

Planc

Estou analisando a situação que você me passou. Porém penso ainda que deve haver alguma fórmula matemática para resolver o caso.

Valeu pela dica !

pmlm

Não existe fórmula mágica. Alguém tem de decidir se arredonda antes ou depois (e deve ser o utilizador que define essa regra).

Criado 11 de dezembro de 2013
Ultima resposta 11 de dez. de 2013
Respostas 10
Participantes 3