Re:bug com Calculo em java

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

Olá

Assim melhora um pouco

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

Resultado: 0.20000004768371582

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.

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.

Olá

[quote=thejokerbm]furutani

mas tem como eu usar isso em qualquer tipo de situacao
pq isso foi apenas um exemplo[/quote]
Dá uma lida nessa excelente explicação do thingol.
http://www.guj.com.br/posts/list/71134.java#373976

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 ***

[quote=thejokerbm]peczenyj

nao tem como corrigir ou melhorar isso nuam?[/quote]

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

Ou evite variáveis de ponto flutuante.

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.

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

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?

furutani

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

peczenyj

nao tem como corrigir ou melhorar isso nuam?

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