Hallo!
Versuche gerade nachzuvollziehen, wie ich in Java Rechenterme notieren muss, damit auch das rauskommt was ich will.
Aber mal von vorne. Es gelten doch folgende Regeln:
- Klammern werden zuerst ausgerechnet
- Operatoren können unterschiedliche Prioritäten haben, nach denen ausgewertet wird
- Ansonsten wird von links nach rechts gerechnet
- Der größte vorkommende Datentyp ist der Datentyp des Ergebnisses (Ausnahme: byte+byte und short+short ergeben int).
Hab ich was vergessen?
Aufjedenfall blick ich trotzdem nicht immer durch.
Beispiel:
Das funktioniert prima - links ein float-literal, rechts zwei ints dank Klammer zu einem "verschmolzen". Und float mit int ergibt immer float.
Warum funktioniert folgendes nicht? (Funktionieren tuts schon, kommt aber ein int bzw. eine Ganzzahl raus)
Es ist das gleiche wie oben, nur fehlen jetzt die Klammern.
Mal und Geteilt haben die gleiche Priorität 12, es geht von links nach rechts. Er müsste demnach doch erst 1.0f/i rechnen -> float/int, es kommt float raus - und dieses Zwischenergebnis dann nochmal mit i multiplizieren, also float * int, das Ergebnis müsste wieder ein Float sein... es kommt aber eine Ganzzahl dabei raus.
Warum?
Danke schonmal!
//edit:
Achja, wenn wir gerade dabei sind:
Ist 1.0 äquivalent zu 1.0d, bzw. repräsentiert eine Zahl mit Punkt aber ohne Suffix immer ein Double-Wert?
Ich meine nur, weil
double i = 1.0;
funktioniert auch ohne das D-Suffix, bei
float k = 1.0;
meckert er aber wegen precision lost von double nach float.
Versuche gerade nachzuvollziehen, wie ich in Java Rechenterme notieren muss, damit auch das rauskommt was ich will.
Aber mal von vorne. Es gelten doch folgende Regeln:
- Klammern werden zuerst ausgerechnet
- Operatoren können unterschiedliche Prioritäten haben, nach denen ausgewertet wird
- Ansonsten wird von links nach rechts gerechnet
- Der größte vorkommende Datentyp ist der Datentyp des Ergebnisses (Ausnahme: byte+byte und short+short ergeben int).
Hab ich was vergessen?
Aufjedenfall blick ich trotzdem nicht immer durch.
Beispiel:
Java:
int i = 3;
float result;
result = 1.0f/(i*i);
Das funktioniert prima - links ein float-literal, rechts zwei ints dank Klammer zu einem "verschmolzen". Und float mit int ergibt immer float.
Warum funktioniert folgendes nicht? (Funktionieren tuts schon, kommt aber ein int bzw. eine Ganzzahl raus)
Java:
int i = 3;
float result;
result = 1.0f/i*i;
Es ist das gleiche wie oben, nur fehlen jetzt die Klammern.
Mal und Geteilt haben die gleiche Priorität 12, es geht von links nach rechts. Er müsste demnach doch erst 1.0f/i rechnen -> float/int, es kommt float raus - und dieses Zwischenergebnis dann nochmal mit i multiplizieren, also float * int, das Ergebnis müsste wieder ein Float sein... es kommt aber eine Ganzzahl dabei raus.
Warum?
Danke schonmal!
//edit:
Achja, wenn wir gerade dabei sind:
Ist 1.0 äquivalent zu 1.0d, bzw. repräsentiert eine Zahl mit Punkt aber ohne Suffix immer ein Double-Wert?
Ich meine nur, weil
double i = 1.0;
funktioniert auch ohne das D-Suffix, bei
float k = 1.0;
meckert er aber wegen precision lost von double nach float.
Zuletzt bearbeitet: