não arredondar valor

11 respostas
mrbox

Bom dia,

Estou fazendo alguns cálculos de moeda e preciso que o sistema não faça arredondamento.

Exemplo de cálculo:

public class TesteDeFloat {

	public static void main(String[] args) {
		
		float a = 0;
		
		a = ((1*10) / 100);
		
		System.out.println(a);

	}
}

Na calculadora, o resultado deste cálculo é “0,1”, mas aqui no java o resultado é “0.0”.
Já tentei mudar a variável para double, mas também não deu certo.

Como devo proceder?

Grato,

11 Respostas

peczenyj

quando vc escreve contantes numéricas, se elas não tem ponto decimal, são consideradas inteiras, e a divisão de numeros inteira é truncada.

vc pode fazer 2 coisas: colocar os pontos decimais

a = ((1.0*10.0) / 100.0);

ou colocar cast para float

a = ((float) (1.0*10.0) / 100.0); //deve bastar

T

((1*10) / 100)
é igual a
10 / 100
que é igual a
0
(quando há 2 números inteiros para fazer a divisão, é feita a divisão inteira, diferentemente do Delphi e do VB).

Para isso funcionar corretamente, use:
((1*10.0) / 100.0)

mrbox

Valeu pessoal,

Estava quebrando a cabeça!
Realmente em Delphi é diferente.

Muito obrigado.

T

Você que conhece Delphi sabe que “/” faz a divisão e converte para um Real, e “div” faz a divisão inteira igual ao Java.
Se você conhece VB (quem não conhece?) sabe que “/” faz a divisão e converte para um Float ou Double, e “” faz a divisão inteira igual ao Java.

T

mrbox:
Bom dia,

Estou fazendo alguns cálculos de moeda e preciso que o sistema não faça arredondamento.

Para trabalhar com moedas, evite ao máximo usar “float”; use “double” ou (se quiser ter um pouco de trabalho) “java.math.BigDecimal”.
É que “float” não tem precisão suficiente para fazer cálculos com moeda (salvo para calcular seu salário :stuck_out_tongue: ) Mas para uma aplicação comercial tradicional, que lida com centenas de milhares de reais, float “abre o bico” e dá erros muito grandes.

peczenyj

Thingol, trabalhar com centavos (ou decimo de centavos, como no caso de preço de gasoluna) ao inves de doubles ou floats não é mais pratico?

Eu trocaria um ponto flutuante por um inteiro, com a ressalva de dividir por 100 na hora de imprimir para o usuario.

marcioa1

O indicado é mesmo o BigDecimal. É um dos tópicos do livro Effective Java. Vale a pena sua leitura

Márcio

T

peczenyj:
Thingol, trabalhar com centavos (ou décimos de centavos, como no caso de preço de gasolina) ao invés de doubles ou floats não é mais prético?

Eu trocaria um ponto flutuante por um inteiro, com a ressalva de dividir por 100 na hora de imprimir para o usuário.

Pode ser feito assim também, com a ressalva que você tem de deixar tudo muito bem documentado para possibilitar a manutenção. Não é todo mundo que entende essa história de centavos, e de qualquer maneira aritmética de ponto flutuante só é muito mais lenta que a inteira em JavaME (onde normalmente é feita por software) e em máquinas muito antigas, que não têm suporte de hardware. (Hoje em dia podemos dizer que a parte mais lenta da aritmética de ponto flutuante é a conversão :stuck_out_tongue: )

orlandocn

O indicado é mesmo o BigDecimal. É um dos tópicos do livro Effective Java. Vale a pena sua leitura

Márcio

vale lembrar que BigDecimal eh em media 4000 vezes mais lento que double!

T

Sem contar que BigDecimal é muito chato de usar (se não souber usar, você pode ter erros maiores que usando um mero double).
Eu prefiro usar “double” a menos que o problema peça valores monetários com mais de 15 casas, e que não envolva coisas mais complexas que uma simples adição ou subtração. Nesse caso é melhor usar BigDecimal.

Ironlynx

Eu sempre recomendei usar BigDecimal para qualquer aplicação "decente" que tratasse com operações aritméticas e tal, até que caí num caso real, de vários cálculos "on-the-fly"(multiplicar e dividir), com precisão apenas de 4 casas(1000,1001 por exemplo).Quando se tem um formulário swing graande(cerca de 90 campos), máquinas antigas como hospedeiras(a maior com 256MB de RAM), o processo Formatação de Entrada->BigDecimal->Formatação de Saída vira um "pain-in-the-ass", principalmente por ter outras coisas como controle de foco,teclado…
Tô até pensando em fazer um componente para o BrazilUtils pensando nisso, algo como JMetricField, com uma opção científica(usando o BD), e outra corrente(com double).

Criado 2 de outubro de 2007
Ultima resposta 2 de out. de 2007
Respostas 11
Participantes 6