Depois de um longo tempo sem visitar o Projeto Euler, retomei recentemente minhas tentativas de resolver os problemas propostos.
Já tinha resolvido alguns, nessa retomada, cheguei aos primeiros 50 resolvidos.
O objetivo é dar uma "desenferrujada" na lógica.
Até hoje, já resolvi 53 problemas e ocupo a posição 60 entre os participantes do Brasil.
sábado, 13 de setembro de 2014
quarta-feira, 3 de setembro de 2014
#dicaJava - BigDecimal, cálculo de prestações
Muitas vezes precisamos calcular uma série de valores, como os valores de uma venda parcelada, a partir de um valor total e o número de parcelas. Ocorre que esse cálculo nem sempre é preciso, muitas vezes vai ocorrer arredondamentos.
O programa abaixo mostra isso:
Executando:
Normalmente, quando a diferença é negativa (diminui o valor da parcela), é costumeiro aplicar a diferença nos valores iniciais, caso contrário, nos valores finais. Também, aplica-se as diferenças centavo a centavo.
Fazendo umas alterações no programa:
O programa abaixo mostra isso:
Executando:
Normalmente, quando a diferença é negativa (diminui o valor da parcela), é costumeiro aplicar a diferença nos valores iniciais, caso contrário, nos valores finais. Também, aplica-se as diferenças centavo a centavo.
Fazendo umas alterações no programa:
#dicaJava - BigDecimal, arredondamento
Um dos posts mais acessados é no qual tratei sobre os problemas de precisão dos tipos float e double e o uso da classe BigDecimal. http://agorandroid.blogspot.com.br/2012/04/java-valores-monetarios-float-double-e.html
Segue um programa que uso para selecionar o tipo de arredondamento entre as diversas opções existentes na classe BigDecimal.
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
public class TesteBigDecimal1 {
public static void main(String[] args) {
List valores = new ArrayList();
BigDecimal valor = new BigDecimal("-0.009");
for (int i=0; i<19; i++) {
valores.add(valor);
valor = valor.add(new BigDecimal("0.001"));
}
List lista = new ArrayList();
lista.add(RoundingMode.CEILING);
lista.add(RoundingMode.DOWN);
lista.add(RoundingMode.FLOOR);
lista.add(RoundingMode.HALF_DOWN);
lista.add(RoundingMode.HALF_UP);
lista.add(RoundingMode.HALF_EVEN);
lista.add(RoundingMode.UP);
for (RoundingMode rm : lista) {
System.out.println("Rounding Mode = " + rm);
for(BigDecimal bd : valores) {
System.out.print("Valor = " + bd);
bd = bd.setScale(2, rm);
System.out.println(" Valor arredondado = " + bd);
}
System.out.println(" ");
}
}
}
Abaixo o resultado da execução:
Rounding Mode = CEILING
Valor = -0.009 Valor arredondado = 0.00
Valor = -0.008 Valor arredondado = 0.00
Valor = -0.007 Valor arredondado = 0.00
Valor = -0.006 Valor arredondado = 0.00
Valor = -0.005 Valor arredondado = 0.00
Valor = -0.004 Valor arredondado = 0.00
Valor = -0.003 Valor arredondado = 0.00
Valor = -0.002 Valor arredondado = 0.00
Valor = -0.001 Valor arredondado = 0.00
Valor = 0.000 Valor arredondado = 0.00
Valor = 0.001 Valor arredondado = 0.01
Valor = 0.002 Valor arredondado = 0.01
Valor = 0.003 Valor arredondado = 0.01
Valor = 0.004 Valor arredondado = 0.01
Valor = 0.005 Valor arredondado = 0.01
Valor = 0.006 Valor arredondado = 0.01
Valor = 0.007 Valor arredondado = 0.01
Valor = 0.008 Valor arredondado = 0.01
Valor = 0.009 Valor arredondado = 0.01
Rounding Mode = DOWN
Valor = -0.009 Valor arredondado = 0.00
Valor = -0.008 Valor arredondado = 0.00
Valor = -0.007 Valor arredondado = 0.00
Valor = -0.006 Valor arredondado = 0.00
Valor = -0.005 Valor arredondado = 0.00
Valor = -0.004 Valor arredondado = 0.00
Valor = -0.003 Valor arredondado = 0.00
Valor = -0.002 Valor arredondado = 0.00
Valor = -0.001 Valor arredondado = 0.00
Valor = 0.000 Valor arredondado = 0.00
Valor = 0.001 Valor arredondado = 0.00
Valor = 0.002 Valor arredondado = 0.00
Valor = 0.003 Valor arredondado = 0.00
Valor = 0.004 Valor arredondado = 0.00
Valor = 0.005 Valor arredondado = 0.00
Valor = 0.006 Valor arredondado = 0.00
Valor = 0.007 Valor arredondado = 0.00
Valor = 0.008 Valor arredondado = 0.00
Valor = 0.009 Valor arredondado = 0.00
Rounding Mode = FLOOR
Valor = -0.009 Valor arredondado = -0.01
Valor = -0.008 Valor arredondado = -0.01
Valor = -0.007 Valor arredondado = -0.01
Valor = -0.006 Valor arredondado = -0.01
Valor = -0.005 Valor arredondado = -0.01
Valor = -0.004 Valor arredondado = -0.01
Valor = -0.003 Valor arredondado = -0.01
Valor = -0.002 Valor arredondado = -0.01
Valor = -0.001 Valor arredondado = -0.01
Valor = 0.000 Valor arredondado = 0.00
Valor = 0.001 Valor arredondado = 0.00
Valor = 0.002 Valor arredondado = 0.00
Valor = 0.003 Valor arredondado = 0.00
Valor = 0.004 Valor arredondado = 0.00
Valor = 0.005 Valor arredondado = 0.00
Valor = 0.006 Valor arredondado = 0.00
Valor = 0.007 Valor arredondado = 0.00
Valor = 0.008 Valor arredondado = 0.00
Valor = 0.009 Valor arredondado = 0.00
Rounding Mode = HALF_DOWN
Valor = -0.009 Valor arredondado = -0.01
Valor = -0.008 Valor arredondado = -0.01
Valor = -0.007 Valor arredondado = -0.01
Valor = -0.006 Valor arredondado = -0.01
Valor = -0.005 Valor arredondado = 0.00
Valor = -0.004 Valor arredondado = 0.00
Valor = -0.003 Valor arredondado = 0.00
Valor = -0.002 Valor arredondado = 0.00
Valor = -0.001 Valor arredondado = 0.00
Valor = 0.000 Valor arredondado = 0.00
Valor = 0.001 Valor arredondado = 0.00
Valor = 0.002 Valor arredondado = 0.00
Valor = 0.003 Valor arredondado = 0.00
Valor = 0.004 Valor arredondado = 0.00
Valor = 0.005 Valor arredondado = 0.00
Valor = 0.006 Valor arredondado = 0.01
Valor = 0.007 Valor arredondado = 0.01
Valor = 0.008 Valor arredondado = 0.01
Valor = 0.009 Valor arredondado = 0.01
Rounding Mode = HALF_UP
Valor = -0.009 Valor arredondado = -0.01
Valor = -0.008 Valor arredondado = -0.01
Valor = -0.007 Valor arredondado = -0.01
Valor = -0.006 Valor arredondado = -0.01
Valor = -0.005 Valor arredondado = -0.01
Valor = -0.004 Valor arredondado = 0.00
Valor = -0.003 Valor arredondado = 0.00
Valor = -0.002 Valor arredondado = 0.00
Valor = -0.001 Valor arredondado = 0.00
Valor = 0.000 Valor arredondado = 0.00
Valor = 0.001 Valor arredondado = 0.00
Valor = 0.002 Valor arredondado = 0.00
Valor = 0.003 Valor arredondado = 0.00
Valor = 0.004 Valor arredondado = 0.00
Valor = 0.005 Valor arredondado = 0.01
Valor = 0.006 Valor arredondado = 0.01
Valor = 0.007 Valor arredondado = 0.01
Valor = 0.008 Valor arredondado = 0.01
Valor = 0.009 Valor arredondado = 0.01
Rounding Mode = HALF_EVEN
Valor = -0.009 Valor arredondado = -0.01
Valor = -0.008 Valor arredondado = -0.01
Valor = -0.007 Valor arredondado = -0.01
Valor = -0.006 Valor arredondado = -0.01
Valor = -0.005 Valor arredondado = 0.00
Valor = -0.004 Valor arredondado = 0.00
Valor = -0.003 Valor arredondado = 0.00
Valor = -0.002 Valor arredondado = 0.00
Valor = -0.001 Valor arredondado = 0.00
Valor = 0.000 Valor arredondado = 0.00
Valor = 0.001 Valor arredondado = 0.00
Valor = 0.002 Valor arredondado = 0.00
Valor = 0.003 Valor arredondado = 0.00
Valor = 0.004 Valor arredondado = 0.00
Valor = 0.005 Valor arredondado = 0.00
Valor = 0.006 Valor arredondado = 0.01
Valor = 0.007 Valor arredondado = 0.01
Valor = 0.008 Valor arredondado = 0.01
Valor = 0.009 Valor arredondado = 0.01
Rounding Mode = UP
Valor = -0.009 Valor arredondado = -0.01
Valor = -0.008 Valor arredondado = -0.01
Valor = -0.007 Valor arredondado = -0.01
Valor = -0.006 Valor arredondado = -0.01
Valor = -0.005 Valor arredondado = -0.01
Valor = -0.004 Valor arredondado = -0.01
Valor = -0.003 Valor arredondado = -0.01
Valor = -0.002 Valor arredondado = -0.01
Valor = -0.001 Valor arredondado = -0.01
Valor = 0.000 Valor arredondado = 0.00
Valor = 0.001 Valor arredondado = 0.01
Valor = 0.002 Valor arredondado = 0.01
Valor = 0.003 Valor arredondado = 0.01
Valor = 0.004 Valor arredondado = 0.01
Valor = 0.005 Valor arredondado = 0.01
Valor = 0.006 Valor arredondado = 0.01
Valor = 0.007 Valor arredondado = 0.01
Valor = 0.008 Valor arredondado = 0.01
Valor = 0.009 Valor arredondado = 0.01
Interessante a opção HALF_EVEN, indicada para tratar grande volume de dados, principalmente estatísticos. O arredondamento, quando o valor a ser desprezado é igual a 5, depende do valor do dígito a ser arredondado ser par ou ímpar. Se for par o comportamento é igual à opção HALF_DOWN, se ímpar igual a HALF_UP .
Vejam o teste abaixo:
Rounding Mode = HALF_DOWN
Valor = -0.095 Valor arredondado = -0.09
Valor = -0.085 Valor arredondado = -0.08
Valor = -0.075 Valor arredondado = -0.07
Valor = -0.065 Valor arredondado = -0.06
Valor = -0.055 Valor arredondado = -0.05
Valor = -0.045 Valor arredondado = -0.04
Valor = -0.035 Valor arredondado = -0.03
Valor = -0.025 Valor arredondado = -0.02
Valor = -0.015 Valor arredondado = -0.01
Valor = -0.005 Valor arredondado = 0.00
Valor = 0.005 Valor arredondado = 0.00
Valor = 0.015 Valor arredondado = 0.01
Valor = 0.025 Valor arredondado = 0.02
Valor = 0.035 Valor arredondado = 0.03
Valor = 0.045 Valor arredondado = 0.04
Valor = 0.055 Valor arredondado = 0.05
Valor = 0.065 Valor arredondado = 0.06
Valor = 0.075 Valor arredondado = 0.07
Valor = 0.085 Valor arredondado = 0.08
Valor = 0.095 Valor arredondado = 0.09
Rounding Mode = HALF_UP
Valor = -0.095 Valor arredondado = -0.10
Valor = -0.085 Valor arredondado = -0.09
Valor = -0.075 Valor arredondado = -0.08
Valor = -0.065 Valor arredondado = -0.07
Valor = -0.055 Valor arredondado = -0.06
Valor = -0.045 Valor arredondado = -0.05
Valor = -0.035 Valor arredondado = -0.04
Valor = -0.025 Valor arredondado = -0.03
Valor = -0.015 Valor arredondado = -0.02
Valor = -0.005 Valor arredondado = -0.01
Valor = 0.005 Valor arredondado = 0.01
Valor = 0.015 Valor arredondado = 0.02
Valor = 0.025 Valor arredondado = 0.03
Valor = 0.035 Valor arredondado = 0.04
Valor = 0.045 Valor arredondado = 0.05
Valor = 0.055 Valor arredondado = 0.06
Valor = 0.065 Valor arredondado = 0.07
Valor = 0.075 Valor arredondado = 0.08
Valor = 0.085 Valor arredondado = 0.09
Valor = 0.095 Valor arredondado = 0.10
Rounding Mode = HALF_EVEN
Valor = -0.095 Valor arredondado = -0.10
Valor = -0.085 Valor arredondado = -0.08
Valor = -0.075 Valor arredondado = -0.08
Valor = -0.065 Valor arredondado = -0.06
Valor = -0.055 Valor arredondado = -0.06
Valor = -0.045 Valor arredondado = -0.04
Valor = -0.035 Valor arredondado = -0.04
Valor = -0.025 Valor arredondado = -0.02
Valor = -0.015 Valor arredondado = -0.02
Valor = -0.005 Valor arredondado = 0.00
Valor = 0.005 Valor arredondado = 0.00
Valor = 0.015 Valor arredondado = 0.02
Valor = 0.025 Valor arredondado = 0.02
Valor = 0.035 Valor arredondado = 0.04
Valor = 0.045 Valor arredondado = 0.04
Valor = 0.055 Valor arredondado = 0.06
Valor = 0.065 Valor arredondado = 0.06
Valor = 0.075 Valor arredondado = 0.08
Valor = 0.085 Valor arredondado = 0.08
Valor = 0.095 Valor arredondado = 0.10
É isso.
Abraços!
Segue um programa que uso para selecionar o tipo de arredondamento entre as diversas opções existentes na classe BigDecimal.
Abaixo o resultado da execução:
Interessante a opção HALF_EVEN, indicada para tratar grande volume de dados, principalmente estatísticos. O arredondamento, quando o valor a ser desprezado é igual a 5, depende do valor do dígito a ser arredondado ser par ou ímpar. Se for par o comportamento é igual à opção HALF_DOWN, se ímpar igual a HALF_UP .
Vejam o teste abaixo:
É isso.
Abraços!
Assinar:
Postagens (Atom)