Großer Java bug beim rechnen?

  • Themenstarter Themenstarter Bug?
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
B

Bug?

Gast
Also entweder ich kann nicht mehr rechnen oder java kanns nicht 😀

hier mein code:

(testet vorher mal mit nem taschenrechner was rauskommt^^)
Code:
public class test4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	double lol ;
	lol=16.6;
	lol=lol+3.9;
	lol=lol+3.9;
	lol=lol+3.9;
	System.out.print(lol);
	

	}

}



Beim normalen Taschenrecher kommt 28,3 raus was ja auch richtig ist. nur das java progrmam zeigt mir ne Periodische Zahl an. Bug oder?
 
wie meinst du das genau?
also bei einem "externen" taschen rechner kommt 28,3 raus ( kopf sagt das auch ^^)

aber bei dem programm kommt: 28.299999999999997 raus
 
also mir kommt das ganze ziemlich komisch vor.
zu genau rechnen geht eigentlich nicht. das muss eigentlich schon n java bug sein. ich hab das ganze grad mal in basic probiert. da rechnet der alles ohne fehler ( qbasic und vb.net)
 
das interesannte ist dass wenn man die 3*3.9 zusammenfast auf 11,7 und das mit 16,6 addiert kommt das richtige ergebniss raus.

Das ist mal voll strange
 
ein Computer hat Probleme, bestimmte Zahlen als Bits und Bytes darzustellen,
genau wie im Zehnersystem 1/3 = 0.333333 schwer darzustellen ist
das ist kein Bug, sondern ein generelles Problem von Computern,

natürlich ist es auch möglich, genau zu rechnen, wenn man nur genug Speicher bereitsstellt, BigDecimal z.B.,
double ist aber ein optimiertes kleines Format mit dem Nachteil der Ungenauigkeit
 
SlaterB hat gesagt.:
natürlich ist es auch möglich, genau zu rechnen, wenn man nur genug Speicher bereitsstellt, BigDecimal z.B.,
Grundsätzlich widerspreche ich da jetzt nicht. Dass "genug Speicher" bei periodischen Zahlen (bzw. spätestens bei irrationalen Zahlen wie PI) gleichbedeutend ist mit "unendlich viel Speicher" macht das ganze aber etwas problematisch.

Ich persönlich finde BigDecimal übrigens extrem häßlich, und man sollte IMHO einen Anfänger nicht dazu verleiten, jeden Sch.... Kleinkram mit BigDecimal zu rechnen. Es gibt IMHO nur SEHR wenige sinnvolle Anwendungsgebiete für diese Klasse. (Im Moment fallen mir GARkeine ein... Und wenn jetzt irgendwas von "Finanzwesen" erzählt wird: Wer für sawas BigDecimal verwendet, ist selbst Schuld...)
 
ich bezog mich jetzt nur auf 16.6+3.9 usw.,
also alles was ein normaler Mensch im Zehnersystem rundungsfehlerfrei hinbekommt 😉

natürlich auch wiederum nicht mit 2 Mil. Nachkommastellen, so dass allein dadurch der Speicher gesprengt wird 😉
 
@Marco13
Was soll den deiner Meinung nach verwendet werden, wenn nicht BigDecimal?

Hier übrigens ein Beitrag, der die Problematik ein wenig erläutert.

ms
 
Marco13 hat gesagt.:
Es gibt IMHO nur SEHR wenige sinnvolle Anwendungsgebiete für diese Klasse. (Im Moment fallen mir GARkeine ein... Und wenn jetzt irgendwas von "Finanzwesen" erzählt wird: Wer für sawas BigDecimal verwendet, ist selbst Schuld...)

Ich hab ma nen (wissenschaftlich angehauchten) Taschenrechner geschrieben, der auch mit etwas größeren Zahlen umgehen kann. Dafür habsch das z. B. gebraucht
 
Es ist kein Problem von Computern, sondern eine Besonderheit der verwendeten Zahlensysteme.
Es gibt auch Zahlen die sich im Dezimal System nicht mit endlichen Nachkommastellen abbilden lassen, in anderen Zahlensystemen aber sehr wohl.
Man denke nur an 1/3:
0,33333....x10
0,1x3
:wink:
 
ui ist ja doch recht kompliziert ^^.gibs da jetzt nen einfachen zahlentyp der sicher ist? und wie muss ich den am code anwednden?
 
Entweder runden oder BigDecimal verwenden.
BigDecimal ist zwar nicht grad sehr handlich, wie Marco schon gesagt hat, dafür gibts aber keine Probleme.

ms
 
achso und noch ne frage zu BigDecimal wie genau geht das?

ich hab folgendes gemacht:

BigDecimal lol;

aber so gehts nicht?
wie genau muss ich BigDecimal anwenden?
 
mhh ich schreib doch lieber den code hier rien

Code:
import java.math.BigDecimal;



public class test4 {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	BigDecimal lol ;
	lol=  16.6;
	lol=lol+ 3.9;
	lol=lol+  3.9;
	lol=lol+  3.9;
	System.out.print(String.valueOf(Math.round(lol)));
	

	}

}
 
Mit der Einstellung kommst du nicht weit.
Schnelle Berechnungen müssen auf vorhandenen Datentypen erfolgen und deren Einschränkungen sollte man kennen (siehe von mir geposteter Link).
Grundlos verwendet niemand andere Datentypen als float oder double, nur wenn es zwingend notwendig ist exakte Ergebnisse zu erhalten, oder mit sehr großen Zahlen umgehen muss, verwendet man Alternativen.
 
omg bahnhof ^^. ach man mir vergeht die lust an java 🙁.
alles viel zu kompliziert und überal gibs ne ausnahme ^^.

Mag mir jemand mein code so verbessern dass es geht?
 
ich will ja nix sagen ^^ aber mein buch :Grundkurs Programmieren in Java Band 1 beinhaltet keine BigDecimal

steht wahrscheinlich in band 2 😀
 
Hiho,

man kann ja auch alle Zahlen vorher in das Sexagesimalsystem umwandeln.
Dieses wurde damals schon von den alten Babyloniern verwendet. Zudem besitzt es eine sehr gute Teilbarkeit.

Verwendet wird es selbst von uns noch -> Uhrzeit, da hiermit besser ("rundere") Zeitangaben möglich sind als mit dem Dezimalsystem.

Wird jeder sehen, wenn er seine Stundenerfassung immer in Dezimalform zurückbekommt.
Aha 8,08333 Stunden gearbeitet. Besser ist dann doch 8h5m 🙂

Zusätzlich kommt dieses System auch noch in der Positionsbestimmung auf der Erde vor. Longitude und Latitude werden standardmäßig auch in Grad/Stunden°Minuten' und Sekunden" angegeben.

bye Saxony
 
Gast hat gesagt.:
ich will ja nix sagen ^^ aber mein buch :Grundkurs Programmieren in Java Band 1 beinhaltet keine BigDecimal
Weil du es nicht brauchst und jetzt auch noch nicht verwenden möchtest.
Mit IEEE Zahlen musst du dich übrigens auch bei anderen Programmiersprachen beschäftigen...
 
Java programmieren ist eben nicht das selbe wie ne Fernbedienung zu programmieren. Java ist eine High-Level Sprache und deshalb von natur aus komplex, bietet dafür aber auch schon sehr viele Möglichkeiten, um die du dich nicht mehr selbst kümmern musst.

Wenn du keine Lust hast Java zu programmieren, dann lass es. Und wenn du es machen musst, dann bezahl jemanden dafür, dass er es für dich erleidgt. www.rentacoder.com
 
äähm falsch ^^ ich werde bezahlt um mit java zu programmieren 😀

So und jetzt nochmal . Kann mir einer ne " gute " lösung mit quellcode geben?

IEEE hab ich auch noch nie gehört ^^
 
omg jetzt raff ich blad gar nichts mehr.
Warum ist String ne klasse. ich dachte immer es sei ein Datentyp wie integer und double auch
 
also die sache ist eigentlich die. ich muss ein kleines verwaltunsprogramm schreiben dass buchungen zusammenzählen kann. das mit dem speichern usw hab ich schon hinbekommen. aber rwenn der "falsch" rechnet bringt mir das ja nix.

Also was ist da jetzt gut geeignet dafür? das BigDecimal oder doch was anderes?
 
die Erde ist rund und String eine Klasse,
was du 'immer dachtest' ist kein Argument

-------

für die Buchungen könntest du auch int/ long verwenden und immer bedenken, dass die letzten beiden Ziffern die Nachkommastellen sind,
bei deinen allgemeinen Fähigkeiten steckt in jedem Verfahren aber Tücken, die dir zu schaffen machen werden
 
String hat Methoden, von daher ist String eine Klasse. Zwar eine besondere Klasse (siehe z. B. die Möglichkeit ohne new zu initialisieren), aber eine Klasse!
 
Hiho,

nein String ist eine Klasse, die Java Syntax erlaubt aber mit String ähnlich zu Verfahren wie mit den primitiven Datentypen.

Code:
String s = "string";

// ist das selbe wie

String s = new String("string");

So und damit dein Porgramm auch 28,3 ausgibt mach folgendes:

Code:
public static void main(String[] args) {

		// TODO Auto-generated method stub
		double lol;
		lol = 16.6;
		lol = lol + 3.9;
		lol = lol + 3.9;
		lol = lol + 3.9;
		System.out.print(new DecimalFormat("#.##").format(lol));
	}

bye Saxony
 
Buchungen bestehen aus Geldbeträge und Geldbeträge haben idR 2 Nachkommastellen. Von daher nimmst du ein float und rundest immer mit Math.round auf zwei Stellen nach das Komma. Fertig!
 
ok und das funktioniert immer? ok danke.

also im prinzip:

Code:
float lol;
l	lol=  16.6;
	lol=lol+ 3.9;
	lol=lol+  3.9;
	lol=lol+  3.9;
System.out.print(String.valueOf(Math.round(lol)));


aber wie genau rund ich da auf 2 stellen?
 
N String is ne Außnahme, die kannst du aber auch über new initialisieren. Vondaher keine Ausnahme, sondern es gibt eine Möglichkeit die Initialisierung zu "vereinfachen". IEEE ist auch keine Außnahme sondern eine Tatsache.

Also, wo siehst du jetzt Außnahmen über Außnahmen?
 
aprop float.

( siehe code den ich vorher gepostet habe)

warum funktioniert das so nicht?

wenn ich "lol" zu float mache kann ich nicht mehr normal addieren!
 
Du regst mich was auf ...

Code:
		   float lol ;
		   lol=16.6F;
		   lol=lol+3.9F;
		   lol=lol+3.9F;
		   lol=lol+3.94564F;
		   System.out.println(lol);
		   System.out.print(Math.round(lol * 100) / 100F);

Un jetzt will ich nix mehr hören!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben