Domanda

In un altro esercizio Bruce Eckel, il codice che ho scritto assume un valore metodo e cambiamenti in un'altra classe. Ecco il mio codice:

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

E 'lanciando un errore che dice "Possibile perdita di precisione."

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

non può essere doubles floats così?

grazie in anticipo

È stato utile?

Soluzione

Sì, ma è necessario specificare che sono galleggianti, altrimenti vengono trattati come doppie:

z.b = 2.2f

Il 'f' alla fine del numero rende un galleggiante invece di una doppia.

Java non si restringe automaticamente un doppio a un galleggiante.

Altri suggerimenti

No, galleggianti possono essere automaticamente upcast a doppie, ma non possono mai essere doppie carri senza cast esplicito perché doppie hanno la gamma più ampia.

gamma galleggiante è 1.40129846432481707e-45 a 3.40282346638528860e+38

doppia gamma è 4.94065645841246544e-324d a 1.79769313486231570e+308d

Per impostazione predefinita, Java tratterà di un decimale (per esempio "4.3") come double a meno che non altrimenti specificato un float aggiungendo un f dopo il numero (ad esempio "4.3f").

Si sta avendo lo stesso problema su entrambe le linee. In primo luogo, il letterale decimale viene interpretata come un doppio dal compilatore. Quindi esso tenta di assegnare a b, che è di tipo float. Poiché un double è di 64 bit e un float è solo 32 bit (vedi la documentazione primitive di Java), Java si dà un errore che indica che il float non può adattarsi all'interno della double. La soluzione è quella di aggiungere un f ai tuoi letterali decimali.

Se si stava tentando di fare il contrario (cioè assegnare un float ad un double), che sarebbe bene dato che è possibile montare un float 32 bit all'interno di un 64 double.

Non utilizzare galleggiante. Non c'è quasi mai un buon motivo per usarlo e non è stato per più di un decennio. Basta usare il doppio.

can't doubles be floats as well?

No. Ciascun valore o variabile ha esattamente un tipo (double, float, int, long, ecc ...). Il linguaggio Java Specification stati esattamente ciò che accade quando si tentare di assegnare un valore di un tipo a una variabile di un altro tipo. In generale, le assegnazioni di un valore "più piccolo" ad un tipo di "più grande" sono consentiti e fatto in modo implicito, ma le assegnazioni in cui le informazioni potrebbero essere persi a causa del tipo di destinazione è troppo "piccolo" per contenere tutti i valori del tipo di origine non sono ammessi dal compilatore, anche se il valore di cemento si adatta nel tipo di destinazione.

Ecco perché il compilatore si lamenta che l'assegnazione di un valore doppio (che letterale implicitamente è) per una variabile float potrebbe perdere informazioni, e bisogna placarlo da una rendendo il valore di un galleggiante, o lanciando in modo esplicito.

Un settore che è spesso causa di confusione è calcoli, perché queste sono implicitamente "allargato" a int per motivi tecnici. Quindi, se si moltiplica due pantaloncini e tenta di assegnare il risultato a un breve, il compilatore si lamenta perché il risultato del calcolo è un int.

gamma galleggiante è inferiore doppia, quindi un galleggiante può essere facilmente rappresentato in doppio, ma l'inverso non è possibile perché, diciamo prendiamo un valore che non è compreso nell'intervallo galleggiante poi durante convenzione perderemo i dati esatti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top