Re:bug com Calculo em java

12 respostas
brothermclaud

Tente primeiro setar o tipo que está usando: Double, float etc.

12 Respostas

furutani

Olá

Assim melhora um pouco

System.out.print( 1.2F - 1D );

Resultado: 0.20000004768371582

CintiaDR

Eu não conheço muito bem os tipos primitivos de java, mas tenho certeza que alguém mais no fórum poderá complementar o que eu vou dizer.

Eu não tenho certeza do quanto vc conhece de representação binária de números decimais; procure no google, por exemplo [google]ponto flutuante binário[/google] ou [google]float point binary[/google]. Mas te adianto que todas as linguagens de programação tem limitações, por estarem num computador que é limitado, com memória limitada.

A idéia é mais ou menos que vc tem um número limitado de bytes para escrever o decimal, e não tem uma precisão perfeita (pensa numa calculadora, tem um número fixo de caracteres depois da vírgula, depois é arredondado). Se vc necessitar de maior precisão, use o BigDecimal ou similar, e existem parâmetros para ajustar o estilo de arredondamento.

Repito, não é bug: é limitação. E ocorre em várias linguagens.

peczenyj

Esse “bug” é conhecido a tempos, na verdade é um problema devido a forma como o Java trata ponto flutuante e, dependendo do que vc quer, pode atrapalhar.

furutani

Olá

thejokerbm:
furutani

mas tem como eu usar isso em qualquer tipo de situacao
pq isso foi apenas um exemplo


Dá uma lida nessa excelente explicação do thingol.
http://www.guj.com.br/posts/list/71134.java#373976

CintiaDR

thejokerbm, eu sei que parece ilógico.

Em C, C++, Pascal, etc, sempre dá a mesma coisa. Todas as linguagens tem ESTA limitação nos pontos flutuantes, porque é o melhor custo benefício encontrado até hj. É aquele frase estúpida de “2+2 é igual a 5 para valores de 2 estupidamente grandes”.

Tente fazer experiências usando os diversos tipos, float, double, Float e Double, e vc verá que bagunça fica.

*** ehehehe o Thingol é meu IDÁLO ***

CintiaDR

thejokerbm:
peczenyj

nao tem como corrigir ou melhorar isso nuam?

Tem, esqueça os computadores :wink: :roll:

Ou evite variáveis de ponto flutuante.

pcalcado

Para matemática exata não se usam pontos flutuantes. Use BigDecimal. isso não é um bug é uma característica de linguagens que implementam padrões sobre ponto flutuante.

T

e ai galera blz?
ou eu sou muito burro o o java tem um bug muito feio

tente fazer isso

System.out.print(1.2-1);

entao nao seria 0.2 entao pq da 0.199999999999999999999999

T

CintiaDR

se o problema fosse esse eu ainda entederia
mas acontece q qualquer calculadora q vc digitar 1.2 - 1 o resultado será 0.2 como em java naum pode ser
se por exemplo 10/3 eu ainda aceitaria mas 1.2 - 1 o resultado eh exato

vc entendeu minha duvida?

T

furutani

mas tem como eu usar isso em qualquer tipo de situacao
pq isso foi apenas um exemplo

T

peczenyj

nao tem como corrigir ou melhorar isso nuam?

T

ai galera resolvi assim

public String converte(double valor){

DecimalFormat format = (DecimalFormat) NumberFormat.getInstance();

format.applyPattern(0.00);

return format.format(valor);

}

llimitei meu campo em duas casas mais melhor assim
vlw galera po imagino o q passa esse pessoal q faz sistemas fisicos com 2+2=5
uahuahuhauhaua

Criado 23 de outubro de 2007
Ultima resposta 23 de out. de 2007
Respostas 12
Participantes 6