Estou com um problema
Substitui todos os capos numéricos do tipo Float pro BigDecimal.
Quando o fiz, li em um post, que dizia que usando BigDecimal.valueOf(0) era melhor do que criar um novo BigDecimal (new BigDecimal()), e foi o que eu fiz, mas agora, estou com um problema.
quando vou com o Debug, e seleciono esse trecho traz a seguinte mensagem:
if( TEntrada.getBigDecimalValue().compareTo(BigDecimal.valueOf(0)) != 0) {...}
Cannot call method"valueOf" in class “java.math.BigDecimal.” The call is ambigous
Gostaria de saber o porque, e se eu posso deixar tudo como esta(BigDecimal.valueOf(valor da variável)), eu se tenho q substituir por new BigDecimal(valor da variável), e se tiver que fazer isso gastará muito mais memórias???
Use BigDecimal.ZERO em vez de BigDecimal.valueOf (0L) ou BigDecimal.valueOf (0.0).
Mas existe algum problema em estar BigDecimal.valueOf(0) ???
Se você leu a documentação (Javadoc) direitinho vai ver que BigDecimal.valueOf aceita um long ou um double, não um int.
Ora, o número 0 (não o número 0L, que é um long, ou 0.0, que é um double) é um int, e um int não é nem um long nem um double.
Quando o compilador vê que você está passando um int, ele sabe que as duas alternativas (um long ou um double) são igualmente válidas pela definição da linguagem, e por isso dá essa mensagem de erro “the call is ambiguous”.
Digamos que em vez de zero (que é um valor enlatado e pronto para uso - veja que já existe até uma constante BigDecimal.ZERO pronta) fosse o número 1234. A mensagem seria exatamente a mesma, e exatamente pela mesma razão.
Nesse caso você usaria BigDecimal.valueOf (1234L) ou BigDecimal.valueOf (1234.0).
E qual é melhor forma???
BigDecimal.ZERO
ou
BigDecimal.valueOf(0.0)
ou
BigDecimal.valueOf(0L)
Existe alguma diferença em performance???
Meça e veja.
No seu caso em particular, use BigDecimal.ZERO porque não cria nem procura nenhum objeto - o objeto já está pronto (não precisa ser recriado com “new”) e não precisa ser procurado (com “valueOf”).
e entre o new BigDecimal(100)
e BigDecimal.valueOf(100.0)
qual usar
Dica: se tiver alguma dúvida de desempenho (será que tal coisa vai levar 9 ou 9,5 nanossegundos?), teste antes, se não conseguir determinar a velocidade só de ler o fonte (que pode enganar muito).
Eu posso usar:
new BigDecimal (“100”)
BigDecimal.valueOf (100L)
etc. Na verdade não há uma diferença assim tão grande de velocidade; o que costuma dar diferenças de velocidade são outras coisas em seu código que não são fáceis de inspecionar à primeira vista, e que não são fáceis de consertar só com uma receita de bolo. E é por isso que costumo dizer: se tem dúvidas quanto à velocidade, e não for alguma coisa que seja fácil de determinar simplesmente inspecionando o fonte, faça uma medição.
[quote=viniciusbc]e entre o new BigDecimal(100)
e BigDecimal.valueOf(100.0)
qual usar[/quote]
Depende … a quantidade que vc está tentando representar aceita facções ?
Se não use 100, se sim, use 100.0.
Note que 100 é diferente de 100.0 que é diferente de 100.00
Cara, não pense que são as facções “Mancha Verde” X “Gaviões da Fiel”. Ele quis dizer “frações” (grafia pt-BR) ou “fracções” (grafia pt-PT).
E outra pergunta, tipo, eu tenho algumas variáveis do tipo int.
Eu estou fazendo o cast dela, multiplicando por um long.
ex:
BigDecimal.valueOf(quantidade*1L)
Pode ser assim, tá errado, existe alguma forma melhor de se fazer???
cast != conversão (exceto no caso de variáveis de tipos primitivos).
Para converter um int em um long, use um cast mesmo, uai:
int quantidade = 12345;
BigInteger qtd = BigInteger.valueOf ((long) quantidade);