Pergunta

Em outro exercício Bruce Eckel, o código que eu escrevi tem um método e altera o valor em outra classe. Aqui está o meu código:

class Big {
  float b;
}

public class PassObject {
  static void f(Letter y) {
    y.c = 'z';
  } //end f()
  static void g(Big z) {
    z.b = 2.2;
  }

  public static void main(String[] args ) {
    Big t = new Big();
    t.b = 5.6;
    System.out.println("1: t.b : " + t.b);
    g(x);
    System.out.println("2: t.b: " + t.b);
  } //end main
}//end class

Ele está jogando um erro dizendo "Possível perda de precisão."

PassObject.java:13: possible loss of precision
found: double
required : float   z.b = 2.2
passobject.java:20: possible loss of precision
found : double
required : float   t.b = 5.6

Não é possível doubles ser floats bem?

Agradecemos antecipadamente

Foi útil?

Solução

Sim, mas você tem que especificar que eles são carros alegóricos, caso contrário, eles são tratados como duplos:

z.b = 2.2f

O 'f' no final do número torna um flutuador em vez de um duplo.

Java não vai diminuir automaticamente uma dupla para um float.

Outras dicas

Não, carros alegóricos podem ser automaticamente upcast de duplas, mas duplos nunca pode ser flutua sem conversão explícita porque duplos têm a faixa maior.

gama float é 1.40129846432481707e-45 para 3.40282346638528860e+38

double intervalo é 4.94065645841246544e-324d para 1.79769313486231570e+308d

Por padrão, o Java irá tratar uma decimal (por exemplo, "4.3") como um double a menos que de outra forma especificar um float pela adição de uma f após o número (por exemplo, "4.3f").

Você está tendo o mesmo problema em ambas as linhas. Primeiro, o literal decimal é interpretado como um double pelo compilador. Em seguida, tenta atribuí-la a b, que é do tipo float. Uma vez que um double é de 64 bits e um float é apenas 32 bits de (ver documentação primitivas de Java), Java dá-lhe um erro indicando que o float não pode caber dentro do double. A solução é adicionar uma f a seus literais decimais.

Se você estava tentando fazer o oposto (ou seja, atribuir uma float a um double), que estaria bem desde que você pode caber 32 bits de um float dentro de um 64 double.

Não use float. Há quase nunca é uma boa razão para usá-lo e não foi por mais de uma década. Basta usar dupla.

can't doubles be floats as well?

No. Cada valor ou variável tem exatamente um tipo (double, float, int, long, etc ...). A Java Specification Language estados exatamente o que acontece quando você tentar atribuir um valor de um tipo a uma variável de outro tipo. Geralmente, as atribuições de um valor "menor" de um tipo "maior" é permitido e feito implicitamente, mas atribuições onde as informações poderiam ser perdidos por causa do tipo de destino é muito "pequeno" para manter todos os valores do tipo de origem não são permitidos pela compilador, mesmo se o valor concreto se encaixa no tipo de destino.

É por isso que o compilador reclama que a atribuição de um valor duplo (que o literal é implicitamente) a uma variável flutuador poderia perder informações, e você tem que aplacar-lo, ou fazendo o valor float, ou lançando explicitamente.

Uma área que muitas vezes provoca confusões é cálculos, porque estes são implicitamente "alargou" para int por razões técnicas. Então, se você multiplicar dois shorts e tentar atribuir o resultado a uma curta, o compilador vai reclamar porque o resultado do cálculo é um int.

faixa de flutuação é menor do que o dobro assim uma bóia pode ser facilmente representada em dobro, mas o inverso não é possível porque, vamos dizer que tomamos um valor que está fora do intervalo de flutuação, em seguida, durante a convenção vamos perder os dados exatos

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top