Zuweisung und Rechenoperationen

ruuckiii

Mitglied
Hallo,

ich hoffe, ihr könnt mir weiterhelfen.

Und zwar habe ich folgende Variable initialisiert:

MeinCode:
double w = 8.6;
        
w = 7 / 2;
        
System.out.println(w);

Wieso kommt bei der Ausführung nun 3.0 als Ergebnis heraus? Und nicht 3.5? an dem Datentypen kann es doch nicht legen - ist ja korrekt - möchte ne Kommazahl haben und habe double benutzt.

Vielen Dank im Voraus!
 

fhoffmann

Top Contributor
Es wird zuerst 7 / 2 berechnet und erst dann an die double-Variable zugewiesen.
Weil aber sowohl 7 als auch 2 ein int sind, wird eine Integer-Division durchgeführt.
 
M

Mart

Gast
du hast im moment
Java:
double = int / int
int / int ergibt eine ganze zahl die abgeschnitten ist... kennzeichne sie als double ( mit einem .0 )
 

jari

Aktives Mitglied
So geht das

Java:
    public static void main(String[] args) {
        System.out.println(new BigDecimal("7").divide(new BigDecimal("2"), MathContext.DECIMAL64).toPlainString());
    }
 

ruuckiii

Mitglied
Ah. Ja. Logisch... Jetzt wo ihr beiden das sagt.... Ja das sind halt so "Feinheiten" die man wissen bzw. achten muss...

Vielen lieben dank!!!! :)
 
M

Mart

Gast
Bei 7/2.0 kann auch mal 3.499999999... herauskommen...

Es war zwar keine explizite Anforderung, aber ich denke nicht das er das möchte.
w = Math.round(....) ? ich bin gegner von komplexität, und sollte vermieden werdne bis es "einen" effekt hat, hier denke ich nicht dass diese rundungs ungenauigkeiten einen effekt haben... wenn er für die bank arbeitet ziehe ich diese aussage zurück ;)
 

httpdigest

Top Contributor
Bei 7/2.0 kann auch mal 3.499999999... herauskommen...
Wenn man ganz korrekt sein möchte, und IEEE 754 Fließkommaarithmetik voraussetzt (so wie es auch von Java verwendet wird), dann ist tatsächlich 7.0/2.0 exakt 3.5.
Jede exakt darstellbare Zahl `x` (hier x = 7.0) geteilt durch eine Potenz von 2 (in diesem Fall 2^1) ist exakt in IEEE 754 darstellbar.
Fließkommaoperationen sind also nicht immer ungenau. Es gibt Situationen und Operationen, bei denen das Ergebnis tatsächlich genau ist.
Natürlich kann man sich darauf bei z.B. User-Eingaben, bei denen man die Werte vorher nicht weiß, nie verlassen.
Ein interessanter Artikel hierzu: https://randomascii.wordpress.com/2017/06/19/sometimes-floating-point-math-is-perfect/
Auch dieser IEEE 754 "Converter" ist ganz nett: https://www.h-schmidt.net/FloatConverter/IEEE754.html
 
M

Mart

Gast
Wenn man ganz korrekt sein möchte, und IEEE 754 Fließkommaarithmetik voraussetzt (so wie es auch von Java verwendet wird), dann ist tatsächlich 7.0/2.0 exakt 3.5.
Jede exakt darstellbare Zahl `x` (hier x = 7.0) geteilt durch eine Potenz von 2 (in diesem Fall 2^1) ist exakt in IEEE 754 darstellbar.
Fließkommaoperationen sind also nicht immer ungenau. Es gibt Situationen und Operationen, bei denen das Ergebnis tatsächlich genau ist.
Natürlich kann man sich darauf bei z.B. User-Eingaben, bei denen man die Werte vorher nicht weiß, nie verlassen.
Ein interessanter Artikel hierzu: https://randomascii.wordpress.com/2017/06/19/sometimes-floating-point-math-is-perfect/
Auch dieser IEEE 754 "Converter" ist ganz nett: https://www.h-schmidt.net/FloatConverter/IEEE754.html
du brauchst nicht irgendwelche standards... alles was mit bits umgehen kann eg strom an und strom aus kann zahlen mit 2 hoch irgendwas darstellen, zb kannst du das auch in minecraft machen das ist relativ wurscht
 

httpdigest

Top Contributor
du brauchst nicht irgendwelche standards... alles was mit bits umgehen kann eg strom an und strom aus kann zahlen mit 2 hoch irgendwas darstellen, zb kannst du das auch in minecraft machen das ist relativ wurscht
Ich habe nur versucht, eine Argumentationskette zu bilden, um zu argumentieren, warum 7.0/2.0 gleich exakt 3.5 ist, ohne plump zu sagen
"alles was mit bits umgehen kann eg strom an und strom aus kann zahlen mit 2 hoch irgendwas darstellen."
Letztere Argumentation wäre sicherlich nicht direkt ersichtlich.
Demnach halte ich es schon für notwendig, dass Leute wissen, was im Speziellen IEEE 754 für Garantien gibt bezüglich der Rundung von Operationen und welche Zahlen exakt darstellbar sind.
Natürlich basiert auch IEEE 754 darauf, dass diese Zahlen letztlich mit Hilfe von Bits dargestellt werden.
 
M

Mart

Gast
also was ich jedem bezüglich minecraft empfehlen kann ist es eine schaltung zu buaen die die zahlen von 0 bis 9 mit glowstone anzeigt zu bauen , dann versteht man mehr über schaltung und was im computer passiert mit den schaltungen .. ist ganz interessant mit und und oder und xor usw mal gebaut zu haben
 

mihe7

Top Contributor
hast du beim int die bits zum speichern von 2 hoch minus 1?
Dass ich für jede Zahl 2^x eine geeignete Abbildung auf binäre Wörter finden kann (so lange genügend Speicher zur Verfügung steht), ist klar. Das heißt nicht, dass das auch für jede Abbildung ("alles, was mit Bits umgehen kann") automatisch gilt. Deswegen kann auch nur mit der jeweils verwendeten Abbildungsvorschrift sinnvoll argumentiert werden.

Der Datentyp int definiert einen konkreten Wertebereich (ganzzahlige Werte aus [-2^31; -1+2^31]), für den es eine Abbildungsvorschrift (in Java Zweierkomplement, MSB first) auf binäre Wörter gibt. Die Zahl 2^(-1) liegt nicht im Wertebereich des Datentyps, ist also mit einem int nicht darstellbar, mit einem float/double dagegen schon und zwar exakt, weil die Abbildungsvorschrift in der IEEE 754 entsprechend definiert ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Henri Anpassung ein Schleife(Zuweisung eines Ordners) Java Basics - Anfänger-Themen 0
Henri Anpassung ein Schleife(Zuweisung eines Ordners) Java Basics - Anfänger-Themen 27
P Array, forSchleife, Zuweisung Java Basics - Anfänger-Themen 24
O this als Zuweisung Java Basics - Anfänger-Themen 5
B Postinkrement Zuweisung Java Basics - Anfänger-Themen 1
G Wie kann man den Erfolg einer Zuweisung als Boolean Wert verwenden? Java Basics - Anfänger-Themen 12
E Best Practice Exaktes Rechnen mit (Pseudo-)Rationalen/Realen Zahlen. Operations Zuweisung für (eigene) Klassen Java Basics - Anfänger-Themen 3
O ExecutorService: ThreadGroup zuweisung? Java Basics - Anfänger-Themen 2
V Arrays aus eigener Klasse erstellt, zuweisung aber spuckt Fehler in verbindung mit main Methode aus. Java Basics - Anfänger-Themen 3
J Zuweisung/Tabelle Java Basics - Anfänger-Themen 6
G OutOfBoundsException bei Array-Zuweisung Java Basics - Anfänger-Themen 2
P Erste Schritte Koordinaten Zuweisung Java Basics - Anfänger-Themen 6
Luk10 Frage zu Zuweisung Java Basics - Anfänger-Themen 7
J Zuweisung von gesicherten Werten funktioniert nicht Java Basics - Anfänger-Themen 9
J Erste Schritte Anfängerproblem Stringkonvertierung und Zuweisung Java Basics - Anfänger-Themen 2
3 Verschachtelte Zuweisung Java Basics - Anfänger-Themen 4
C Array zuweisung Java Basics - Anfänger-Themen 4
D Array-Zuweisung Java Basics - Anfänger-Themen 4
H variablen zuweisung Java Basics - Anfänger-Themen 4
T OOP StringTokenizer, Zuweisung der einzelnen Attribute Java Basics - Anfänger-Themen 21
B Fragen zur Initialisierung/Zuweisung der Variable + Packages erstellen Java Basics - Anfänger-Themen 4
F int zuweisung überprüfen Java Basics - Anfänger-Themen 3
hdi Verständnisfrage zu Zuweisung + Post-Inkrement Java Basics - Anfänger-Themen 3
A kurze frage zu arrays und deren zuweisung Java Basics - Anfänger-Themen 11
G Wieso ist eine String-Übergabe keine by-reference-Zuweisung? Java Basics - Anfänger-Themen 7
Z zuweisung this. Java Basics - Anfänger-Themen 12
S Zuweisung mit Operation "^=" Java Basics - Anfänger-Themen 2
M IntegerVariable und Zuweisung von Zahlen die mit 0 anfangen! Java Basics - Anfänger-Themen 3
H Variable zuweisung in einem If-Statement Java Basics - Anfänger-Themen 3
F Abfrage in Zuweisung mit Fragezeichen Java Basics - Anfänger-Themen 5
Z Zugriff auf Attribute nach Zuweisung einer Referenz Java Basics - Anfänger-Themen 8
R Rechenoperationen mit Modulo Java Basics - Anfänger-Themen 2
kilopack15 Rechenoperationen Java Basics - Anfänger-Themen 2
W In einer Function<Double, Double> undefinierte Rechenoperationen abfangen? Java Basics - Anfänger-Themen 3
P Keine Rechenoperationen bei Doublewert? Java Basics - Anfänger-Themen 4
S Rechenoperationen auswählen Java Basics - Anfänger-Themen 14

Ähnliche Java Themen


Oben