Nel mio vecchia conoscenza: quando vogliamo verificare se un letto matrimoniale o flottante è pari 0.0,
abbiamo non dovrebbe scrivere in questo modo:
In corrente C++ e Java, doppio tipo e tipo float: if (x == 0.0) è corretto?
double x = 0.0;
if (x == 0.0) System.out.println("yes");
else System.out.println("no");
Ma qualche minuto fa, ho provato ancora una volta, sotto Java (1.7) e C++ (Apple LLVM versione 6.0), non c'è nessun problema a scrivere in quel modo! Ho provato sia il tipo "double" che il tipo "float" in Java e C++, rispettivamente.
La mia domanda:
- Mi sono perso qualcosa, o siamo davvero in grado di controllare il doppio o galleggiare come che sotto Java attuale e C++.
- Se possiamo, se possiamo farlo con la versione precedente di Java e C++?
Conclusione (sulla base di tutte aiuta):
Noi non dovrebbe uso "galleggiare == float o doppi == doppi" per verificare se due galleggianti o due doppie sono uguali ( se vogliamo ottenere la risposta giusta), i motivi sono in tutte le risposte e i commenti sotto.
Edition (prima volta):
Grazie mille per tutto l'aiuto!
Ma un minuto fa, cerco solo di questi sotto Java (1.7), tutto spettacolo " sì",
sembra che davvero in grado di farlo in corrente Java!
float x = 0.0f;
if (x == 0) System.out.println("yes");
else System.out.println("no");
float y = 100.0f - 50.0f*2.0f + 45.0f*3 - 135.0f;
if (y == 0.0f) System.out.println("yes");
else System.out.println("no");
if (100.0f - 50.0f*2.0f + 45.0f*3 - 135.0f == 0.0f) System.out.println("yes");
else System.out.println("no");
edizione (seconda volta):
Ma ho provato questo, Java mostra anche " sì", (in Java (1.7)).
Io provo a eliminare "pre-compute" del compilatore e dividere il calcolo in diversi passaggi.
float a = 100.0f;
float b = 50.0f;
float c = 2.0f;
float bc = b * c;
System.out.println("b*c = " + bc);
float d = 45.0f;
float e = 3.0f;
float de = d * e;
System.out.println("d*e = " + de);
float f = 135.0f;
float g = a - bc + de - f;
float h = 0.0f;
if (g == h) System.out.println("yes");
else System.out.println("no");
edizione (terza volta):
Grazie per @ di DiegoBasch controesempio (per float == float):
Questa volta Java (1.7) mostra " no".
float m = 0.37f - 0.36f;
float n = 0.01f;
if (m - n == 0.0f) System.out.println("yes");
else System.out.println("no");
'x' è esattamente' 0', quindi è OK. Il problema è quando 'x' è il risultato di una sequenza di operazioni che matematicamente produrrebbe' 0', ma non danno come risultato '0.0' per ragioni numeriche. – juanchopanza
Per approfondire ciò che @juanchopanza ha detto, nel tuo caso valuterà il vero, ma non puoi garantire che '100.0 - 50.0 * 2.0 == 0.0' anche se matematicamente dovrebbe. – CoryKramer
I punti mobili sono spesso descritti come valori "approssimativi", il che è fuorviante. Un numero in virgola mobile ha un valore esatto, è solo che questo valore potrebbe non essere esattamente quello che ti aspetti a causa della precisione limitata. Pertanto, se lo stai confrontando con un valore atteso, dovresti chiedere "sono esattamente uguali", ma piuttosto "sono abbastanza vicini". '0.0' non è diverso da' 1.3' o '3.14159' in questo senso. – yshavit