tenho uma variavel float e quero imprimi-lá na interface grafica mas tenho perda de precisão. como eu faço??
abraço
cara, vc já experimentou usar double ? ele tem uma precisão maior.
Aprende a viver com isso ou trunca para a precisão que você precisa.
solucoes:
- usar float
- usar double
- truncar
- arredondar
- usar BigDecimal
- usar long multiplicando pelo numero de casas decimais necessarios
vale lembrar das discussoes classicas de aritmetica de ponto flutuante onde eh impossivel representar todos os numeros reais em funcao de 0s e 1s… portanto sempre vai existir erro nessa representacao
De qualquer maneira, para você que tem um computador com milhões (talvez bilhões) de bytes de memória, economizar memória usando “float” em vez de “double” não ajuda muito.
Nem é questão de ser mais rápido - se você está usando um PC, por exemplo, todas as contas são feitas internamente com 80 bits (que é mais que um float = 32 bits ou um double = 64 bits), e não faz diferença nenhuma em termos de velocidade.
Esse conselho mesmo o pessoal do C/C++ recebe quando aprende a linguagem - é mais difícil lidar com “float” que com “double” em C. E esse conselho eu recebi há quase 20 anos, quando o hardware era mais fraco que o existente hoje em dia.
Acho que só é válido usar floats quando você tem arrays muito grandes (onde o tempo de acesso à memória domina sobre o tempo de computação, é melhor usar menos memória), e quando você tem de usar esses arrays em computação gráfica (onde em vez de usar o coprocessador aritmético normal, que trabalha com 80 bits, usam-se as instruções MMX e SSE, que preferem trabalhar com 32 e 64 bits).
é isso q eu quero
float x =10/3;
isso vai dar 3,3333333333
e colocar x numa JTextArea!
mas quando uso setTExt(x.toString()) aparece apenas 3.0
Aham - 10 / 3 dá exatamente 3 (quando você divide dois inteiros, o resultado é um inteiro. Isso é uma herança do C/C++, que funciona assim. Só para comparar, em Pascal/Delphi a divisão inteira se chama “div” e em VB a divisão inteira é feita com o operador “”.)
Não é perda de precisão de um float.
Agora, 10.0 / 3 é que dá 3.333333… mas pode ser que os últimos algarismos não sejam 3333 no float, por causa (aí sim) da falta de precisão.
e se eu quero dividir os dois inteiros e colocar na JTExtArea? É possivel ou vou ter q usar outro tipo???
É só converter um deles para double:
int x = 10;
int y = 3;
String xy;
xy = Double.toString( (double)x / y);
Pergunta - o que ocorre quando y = 0?
[quote=thingol]É só converter um deles para double:
int x = 10;
int y = 3;
String xy;
xy = Double.toString( (double)x / y);
Pergunta - o que ocorre quando y = 0?
[/quote]
Thingol, cuidado. Pergunta de certificacao: quando y diferente de 0. o codigo acima compila? roda? qual o resultado do seu codigo?
Agora analise as alternativas abaixo, a primeira eh a sua:
String suaAlternativa = Double.toString( (double) 10 / 3);
String outraAlternativa = Double.toString( 10.0 / 3);
repare que os resultados sao diferentes!
PS: O Guilherme decorou a tabela de operações do I3E 754.
hueuhehue
Para simular o float:
http://www.h-schmidt.net/FloatApplet/IEEE754de.html
Para ver a descricao simples (32 e 64):
Tem um site do cara que fez a critica quando ainda nao existia a 754, nao lembro mais o nome dele… William algo? Nao lembro
Aproveitando, qual o seu número em ponto flutuante preferido?
Eu gosto dos zeros com sinal. Ter +0 de saldo quase me faz esquecer que o cheque especial me espera.
Nada como (Double.POSITIVE_INFINITY + Double.NEGATIVE_INFINITY)
Isto eh, a soma de dois numeros NAO reais da…
Desculpe resucitar esse tópico de 7 anos de idade, mas como a discussão aqui é de pessoas que conhecem a tal da IEEE754, gostaria de saber a respeito da seguinte questão:
public class Conversion
{
public static void main(String[] args)
{
int i = 1234567890;
float f = i;
System.out.println(i - (int)f);
}
}
bom a explicação ae é a seguinte no mock da enthware:
Pesquisando na Net vi que esta questão está ligada a IEE754, mas gostaria de saber se tem uma especificação dos digitos significativos para cada range(Float, Double…), já que vi aqui uma pessoa falar a respeito desta informação:
http://www.coderanch.com/t/266307/java-programmer-SCJP/certification/Changes-out-put
Ele fala a respeito dos 52 bits significativos do double, e do comportamento da Vm
[quote]Integer.MAX_VALUE (2147483647) is a more interesting case. This will get mapped to a float value of 2^31, or 2147483648. (All numbers from 2147483584 to 2147483776 will be mapped to this value.) However, when you cast this float value back to an int, this is larger than the maximum value of an int, so the JVM maps it back to Integer.MAX_VALUE. Hence your equality test prints “true”.
[/quote]
Gostaria de saber onde encontro essas informações de forma mais detalhada, pois agora não sei se posso por um int em um float… ou se posso fazer casting de long para double… pois não sei como os bits significativos se comportam…
Agradeço.