Verständnisfrage Genauigkeit

Status
Nicht offen für weitere Antworten.

HStev

Mitglied
Hallo,

ich weiß das Thema wird hier oft durchgekaut aber in keinen Thread wird die Frage wirklich zufriedentstellend beantwortet.

Ich hab zb. folgende Klasse:
Code:
public class test {
	public static void main(String[] args) {
		double a,b;
		
		a = 1.6;
		b = 0.5;
		System.out.println(a - b);
		
		a = 1.6;
		b = 1.0;
		System.out.println(a - b);
		
		a = 1.6;
		b = 1.5;
		System.out.println(a - b);
	}
}

Die Ausgabe davon ist:
1.1
0.6000000000000001
0.10000000000000009


Warum fällt bei den letzten die Genauigkeit so aus dem Rahmen und nicht auch bei der 1. Berechnung?
Kann man das irgendwie abfangen?
 

HStev

Mitglied
stev hat gesagt.:
aber in keinen Thread wird die Frage wirklich zufriedentstellend beantwortet.

miss ich etwa jede klitzekleine Berechnung selbst runden?

Warum gibt es für Runden eigentlich keine fertige Klasse/Function?
 
B

bygones

Gast
stev hat gesagt.:
stev hat gesagt.:
aber in keinen Thread wird die Frage wirklich zufriedentstellend beantwortet.

miss ich etwa jede klitzekleine Berechnung selbst runden?

Warum gibt es für Runden eigentlich keine fertige Klasse/Function?
Api gucken hilft.

Math Klasse bzw. die Formatter oder auch NumberFormats
 

HStev

Mitglied
Die Frage die sich mir dabei stellt woher weiß ich immer wieviele Nachkommastellen meine Berechnungen ergibt klar bei Plus/Minus kann ich es voraussagen aber ansonsten?
 

HStev

Mitglied
Sorry das ich jetzt einen total banalen Vergleich bringe aber es geht ums Prinzip:

Ich hab 2 Quelltexte einmal PHP und einmal Java:

Beide sollen einfach nur 1.66564 - 1.55463 rechnen.

Code:
<?php
$a = 1.66564;
$b = 1.55463;

echo $a - $b;
?>

Ausgabe:


Code:
import java.text.*;

public class test {
	public static void main(String[] args) {
		double a,b;
		NumberFormat nf = NumberFormat.getInstance();
		
		a = 1.66564;
		b = 1.55463;
		System.out.println(a - b);
		System.out.println(nf.format(a - b));
			
	}
}

Ausgabe:
0.11101000000000005
0.111


Selbst der Taschenrechner von Windows liefert mir das richtige Ergebnis... sorry das ist zwar alles schön und gut aber warum bekommt man das mit Java nicht genauso hin?
 

Ilja

Bekanntes Mitglied
weil java kein taschenrechner ist -.-

ein taschenrechner rundet es intern auch, bevor es angezeitg wird!
gleiches trifft auf php zu...
 

Bleiglanz

Gesperrter Benutzer
php unterschlägt eben die Details, damit die Benutzer immer schön zufrieden sind

und das "Prinzip" ist ganz einfach

0.1 = a_1 * (1/2) + a_2 *(1/4) + a_3 * (1/8) + a_4 * (1/16) + ...

wenn du das mit endlich vielen a_i (die alle 0 oder 1 sind) lösen kannst, dann wirst du das auch mit Java genauso hinbekommen :)
 

HStev

Mitglied
Wie kann man damit vernünftig arbeiten?
Sorry aber genau das hat mich bisher immer daran gehindert mit Java mehr zu machen.
Ich find das ist einfach sch... wenn ich bei komplizierteren Berechnung erst prüfen muss obs nicht ein interner Rundungsfehler ist. Das mag zwar von der Computer-Architektur her vollkommen logisch zu sein das da ein Rundungsfehler auftaucht aber es wird mich wahrscheinlich auch weiterhin davon abhalten in Java mehr zu machen wenn es dafür keine "vernünftige" Lösung gibt.
 

Illuvatar

Top Contributor
Das hat nichts mit Java zu tun. Es ist nur so, dass die Ausgabemethoden von vielen anderen Sprachen automatisch runden. Das kannst du in Java auch machen. Aber in von alle (normal gebräuchlichen (Java C# C++ Delphi Bla)) Sprachen erzeugten Programmen werden Fließkommazahlen so dargestellt, dass es nun mal ungenau ist.
 

HStev

Mitglied
Illuvatar hat gesagt.:
Es ist nur so, dass die Ausgabemethoden von vielen anderen Sprachen automatisch runden. Das kannst du in Java auch machen.

Und warum gibt es dafür keine Klasse in Java? Die NumberFormat rundet ja eine "entscheidende" einfach weg.
 

HStev

Mitglied
stev hat gesagt.:
Die Frage die sich mir dabei stellt woher weiß ich immer wieviele Nachkommastellen meine Berechnungen ergibt klar bei Plus/Minus kann ich es voraussagen aber ansonsten?

nur mal als Beispiel wenn ich mir überlege einen Taschenrechner zu programmieren ... na klasse n Taschenrechner der ne stelle verschluckt :bloed:
 

byte

Top Contributor
Also ich verstehe das Problem nicht. Du kannst doch dem NumberFormat die gewünschte Genauigkeit mitteilen und hast dann das gewünschte Ergebnis.

Code:
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(10);

double a = 1.66564;
double b = 1.55463;

System.out.println(a - b);               // 0.11101000000000005
System.out.println(nf.format(a - b));    // 0,11101
 

Sky

Top Contributor
HStev hat gesagt.:
Wie kann man damit vernünftig arbeiten?
Sorry aber genau das hat mich bisher immer daran gehindert mit Java mehr zu machen.
Ich find das ist einfach sch... wenn ich bei komplizierteren Berechnung erst prüfen muss obs nicht ein interner Rundungsfehler ist. Das mag zwar von der Computer-Architektur her vollkommen logisch zu sein das da ein Rundungsfehler auftaucht aber es wird mich wahrscheinlich auch weiterhin davon abhalten in Java mehr zu machen wenn es dafür keine "vernünftige" Lösung gibt.

Damit ist der Thread doch eigentlich schon beendet.
Du hast Dich entschieden, deine Probleme auf eine andere Art zu lösen.
 

Bleiglanz

Gesperrter Benutzer
Wie kann man damit vernünftig arbeiten?
scheinbar neu in der Computer-Welt?

Wem das nicht passt, für den gibts in Java BigInteger und BigDecimal, beim Rechnen mit Währungen ist das sogar "üblich"

Sorry aber genau das hat mich bisher immer daran gehindert mit Java mehr zu machen.
Dann bleib bei Smalltalk, Lisp, Maple oder dem genialen System mit dem du bisher gearbeitet hast

In C C++ VB.NET C# Delphi PHP Perl sind diese bösen Effekte jedenfalls standardmässig eingebaut
 
S

stev.glasow

Gast
*rufRette*
Ich bin weder stev noch hstev. Hatte stev gebeten seinen Nick zu ändern, nun heißt er hstev :?

@topic: :roll:
 

HStev

Mitglied
@stevq stevq u. HStev sehehn doch vollkommen anders aus und hören sich auch anders das einzigst gemeinsame ist das stev ... aber wenn man sonst keine Probleme hat...

Die Lösungen sind zwar schön und gut aber wie soll man damit Vergleiche anstellen. Sorry wenn ich nerve ich wills nur endlich mal kapieren warum das in in Java so kompliziert ist.

Code:
import java.text.*;

public class test {
	public static void main(String[] args) {
		double a,b,c,d;
		NumberFormat nf = NumberFormat.getInstance();
		
		a = 4.66;
		b = 1.55;
		c = 1.44;
		d = 1.33;
		
		double erg = a - b - c - d;
		
		if (erg == 0.34)
		{
			System.out.println("Stimmt 1");
		}
		
		if(nf.format(erg) == "0.34")
		{
			System.out.println("Stimmt 2");
		}
		
		System.out.println(a - b - c - d);
		System.out.println(nf.format(a - b - c -d));	
	}
}

Ausgabe:
0.3400000000000003
0.34
 

Bleiglanz

Gesperrter Benutzer
du sollst in KEINER Programmiersprache jemals doubles oder floats auf gleichheit testen

Code:
if(Math.abs(a-b) < 0.0000001){

}
wobei man die Genauigkeit eben nach Aufgabenstellung einstellt

das ist die EINZIGE Möglichkeit
 

norman

Top Contributor
public int java.lang.Double.compareTo(Double anotherDouble)
Returns:
the value 0 if anotherDouble is numerically equal to this Double; a value less than 0 if this Double is numerically less than anotherDouble; and a value greater than 0 if this Double is numerically greater than anotherDouble.
funktioniert folglich auch nicht?
 

norman

Top Contributor
warum wird darauf in der API nicht hingewiesen? oder verstehe ich "numerically" falsch?
bzw. wozu nützt diese Methode dann?
 
S

stev.glasow

Gast
Ne, las mal. Das Thema an sich wär mal was für die FAQ aber nicht dieser Thread.
 

HStev

Mitglied
Naja ich mein ja nur weil das mit der Genauigkeit war mir nie so klar ... ansonsten der Rest Design Patterns, OOP, RegEx und was es da sonst noch gibt ist soweit klar...und ich denke wie mir wird es vielen anderen auch gehen.
 
B

bygones

Gast
trotzdem ist es unsinnig diesen Thread als sticky für Informationsgewinn zu machen. Dafür ist er zu unstrukturiert - wenn dann einen schönen FAQ Beitrag schreiben und schöner is
 

byte

Top Contributor
Das ist ja nur eine von vielen immer wiederkehrenden Fragen und wenn man für jede einen Thread sticked, dann darf man für die "normalen" Threads auf Seite 2 blättern. Wer der Nachwelt etwas Gutes tun will und/oder zuviel Zeit hat, der schreibt einen Eintrag für die FAQ, der kurz, knapp und präzise ein Problem löst, und gut is. :roll:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
A Verständnisfrage Java Basics - Anfänger-Themen 12
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
P Verständnisfrage: PageFactory.initElements Java Basics - Anfänger-Themen 2
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
G while.next() Verständnisfrage Java Basics - Anfänger-Themen 16
Vivien Kurze Verständnisfrage zu Java Point aus java.awt.* Java Basics - Anfänger-Themen 5
C Erste Schritte Anfänger Verständnisfrage zum Compiler Java Basics - Anfänger-Themen 31
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
Der Grütz Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen Java Basics - Anfänger-Themen 2
J Verständnisfrage zu throws neben Funktionen Java Basics - Anfänger-Themen 2
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
P Verständnisfrage zum Mapping Java Basics - Anfänger-Themen 3
M Java Version Verständnisfrage Java Basics - Anfänger-Themen 16
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Verständnisfrage zur Konsolenausgabe Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
D Verständnisfrage zur Modellierung einer HDD Java Basics - Anfänger-Themen 17
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
S Verständnisfrage lokale Ordnerpfade Java Basics - Anfänger-Themen 1
T Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 7
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
O Anfänger, Verständnisfrage Java Basics - Anfänger-Themen 3
C Verständnisfrage zu Modulo Java Basics - Anfänger-Themen 6
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
L Verständnisfrage - Speicherabbild Java Basics - Anfänger-Themen 4
melly_ Verständnisfrage zu args Java Basics - Anfänger-Themen 3
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
K Verständnisfrage eines Abschnitts Java Basics - Anfänger-Themen 6
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
S Modell View Controller Verständnisfrage Java Basics - Anfänger-Themen 24
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
JavaTalksToMe Erste Schritte Println-Frage (Verständnisfrage) Java Basics - Anfänger-Themen 1
R Verständnisfrage zu Objekten u. Übergabeparameter Java Basics - Anfänger-Themen 8
G Collections Verständnisfrage zur For-Each-Schleife Java Basics - Anfänger-Themen 7
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
G Verständnisfrage zu for-each Java Basics - Anfänger-Themen 4
DontFeedTheTroll Erste Schritte Verständnisfrage zu If-Anweisung Java Basics - Anfänger-Themen 7
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
Z Verständnisfrage Anfängerprogramm Java Basics - Anfänger-Themen 0
T Verständnisfrage Zuweisungs-/arithmet. Operatoren Java Basics - Anfänger-Themen 2
G Methoden Verständnisfrage zur Methoden Java Basics - Anfänger-Themen 7
LionAge Kapselung, Verständnisfrage zur Objekterzeugung Java Basics - Anfänger-Themen 4
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
R OOP / Verständnisfrage zum Konstuktor (siehe code) Java Basics - Anfänger-Themen 7
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
A Verständnisfrage - Koordinatenumrechnung Java Basics - Anfänger-Themen 9
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage Array Java Basics - Anfänger-Themen 2
I Interface Verständnisfrage Interfaces (Bsp.: Enumeration) Java Basics - Anfänger-Themen 2
I Verständnisfrage zu BridgePattern, Verwedung von super() Java Basics - Anfänger-Themen 4
P Verständnisfrage Java Basics - Anfänger-Themen 3
kaoZ Best Practice Verständnisfrage Listener bei lokalen Objekten Java Basics - Anfänger-Themen 8
D Input/Output Verständnisfrage Verzeichnis-/Dateiliste erstellen & Dateikonvertierung Java Basics - Anfänger-Themen 1
S Verständnisfrage zu Anweisungen und deren Wirkung Java Basics - Anfänger-Themen 7
H Verständnisfrage für oder Anweisung Java Basics - Anfänger-Themen 8
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage zu Java-Ausgabe Java Basics - Anfänger-Themen 3
S Verständnisfrage Java Basics - Anfänger-Themen 2
N Verständnisfrage Code Java Basics - Anfänger-Themen 8
B Verständnisfrage Java Basics - Anfänger-Themen 2
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Verständnisfrage Codezeile Java Basics - Anfänger-Themen 7
B Verständnisfrage:Beispielprogramm BlueJ Java Basics - Anfänger-Themen 3
M Kurze Verständnisfrage zu einer Java Aufgabe Java Basics - Anfänger-Themen 12
K Erste Schritte Kleine Verständnisfrage Java Basics - Anfänger-Themen 12
R Verständnisfrage Referenzvariablen in array Java Basics - Anfänger-Themen 3
M Verständnisfrage: Objekt erzeugen u. zuweisen Java Basics - Anfänger-Themen 16
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
S Verständnisfrage: Exception Gebrauch Java Basics - Anfänger-Themen 2
R Verständnisfrage NPE Java Basics - Anfänger-Themen 5
M Verständnisfrage zur Zahlenumwandlung (Dezimal-->Dual) Java Basics - Anfänger-Themen 25
P Java Objekte - Verständnisfrage Java Basics - Anfänger-Themen 9
N Verständnisfrage zu folgendem Programm Java Basics - Anfänger-Themen 2
L Grundlegende Verständnisfrage Hasmap Referenzen Java Basics - Anfänger-Themen 4
S Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 2
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
P Verständnisfrage zu Instanzen/Objekten Java Basics - Anfänger-Themen 9
M Verständnisfrage im Umgang mit Map Java Basics - Anfänger-Themen 10
K Verständnisfrage zu int.length und String.length() Java Basics - Anfänger-Themen 4
G 2D Array gleichsetzen verständnisfrage Java Basics - Anfänger-Themen 2
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
E Verständnisfrage zu Shutdownhook Java Basics - Anfänger-Themen 5
D Verständnisfrage: Java und MySql Java Basics - Anfänger-Themen 3
F Rekursion Verständnisfrage Java Basics - Anfänger-Themen 6
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
Z Comparator Verständnisfrage Java Basics - Anfänger-Themen 5
D Verständnisfrage zu Funktionen Java Basics - Anfänger-Themen 6
H Verständnisfrage Persistenz Java Basics - Anfänger-Themen 10
neurox Verständnisfrage zu Threads Java Basics - Anfänger-Themen 4
E Verständnisfrage Syntax: frame.getContentPane().add(button) Java Basics - Anfänger-Themen 11
Y Kleine Verständnisfrage zum Thema dynamische Polymorphie Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben