Hallo,
ich habe ein sehr seltsames Problem und kann mir einfach nicht erklären woran es liegt. Vermutlich wieder eine von diesen Sachen, wo man sich später gegen den Kopf schlägt, dass man nicht früher drauf gekommen ist...
Ich habe ein Programm, in dem der Benutzer in verschiedene Textfelder Zahlen eingibt, diese werden ausgelesen, wenn der Benutzer einen Button drückt und dann an den Konstruktor einer Schiff-Klasse übergeben:
[JAVA=1044]class Schiff
{
String bezeichnung;
int partikelAngriff;
int energieAngriff;
int schilde;
int panzer;
int antrieb;
int hitpoints;
Integer position1;
Integer position2;
Integer position3;
Integer position4;
Integer position5;
Integer position6;
Integer position7;
double absolutePosition;
boolean zerstört;
boolean gereiht;
public Schiff(String bezeichnung, int partikelAngriff, int energieAngriff, int schilde, int panzer, int antrieb, int hitpoints)
{
this.bezeichnung = bezeichnung;
this.partikelAngriff = partikelAngriff;
this.energieAngriff = energieAngriff;
this.schilde = schilde;
this.panzer = panzer;
this.antrieb = antrieb;
this.hitpoints = hitpoints;
absolutePosition = ((double)(this.partikelAngriff + this.energieAngriff)) - (((double)this.antrieb) / ((double)this.hitpoints));
if(absolutePosition > 0)
{
absolutePosition = ((int)((absolutePosition * 10000) + 0.5)) / 10000.0;
}
if(absolutePosition < 0)
{
absolutePosition = ((int)((absolutePosition * 10000) - 0.5)) / 10000.0;
}
position1 = (int)(absolutePosition / 100);
position2 = ((int)(absolutePosition / 10)) - (((int)(absolutePosition / 100)) * 10);
position3 = ((int)absolutePosition) - (((int)(absolutePosition / 10)) * 10);
position4 = ((int)(absolutePosition * 10)) % 10;
position5 = ((int)(absolutePosition * 100)) % 10;
position6 = ((int)(absolutePosition * 1000)) % 10;
position7 = ((int)(absolutePosition * 10000)) % 10;
}[/code]
Nun wollte ich an ein paar Beispiel-Werten testen, ob die Werte für die Variablen absolutePosition und position1 bis position7 richtig berechnet werden und keine Rundungsfehler auftreten.
In den meisten Fällen funktioniert das auch und ich bekomme die richtigen Werte. Bei einigen Fällen fiel mir aber auf, dass plötzlich an Stellen, die eine 0 aufweisen sollten, eine 9 stand und wenige Male auch bei Stellen mit einer 5 eine 4.
Ich habe auch einige Werte durchgetestet, um zu sehen, ob die Werte irgendwelche markanten Gemeinsamkeiten haben, die auf den Fehler hinweisen könnten, konnte bis jetzt aber nicht fündig werden. Hier meine Beispielwerte (die erste Zahl ist der Wert absolutePosition, die zweiten die Werte von position1 - position7 hintereinander):
2,3 0023900
4,1 0041900
4,6 0046900
5,1 0059100
8,2 0082900
8,7 0087900
9,7 0097900
10,2 0102900
16,4 0164900
16,9 0169900
19,9 0199900
20,4 0204900
32,3 0323990
32,8 0328900
33,3 0333900
40,3 0403900
40,8 0408900
64,1 0641990
64,6 0646990
65,1 0651990
65,6 0656900
66,1 0661900
81,1 0811900
81,6 0816900
128,2 1282990
128,7 1287990
130,2 1302990
130,7 1307990
131,2 1312900
131,7 1317900
163,2 1632900
163,7 1637900
256,4 2564990
256,9 2569990
261,4 2614990
261,9 2619990
262,4 2624900
262,9 2629900
326,9 3269900
327,4 3274900
512,3 5123990
512,8 5128990
523,3 5233990
523,8 5238990
524,3 5243900
524,8 5248900
654,8 6548900
655,3 6553900
Die einzige Gemeinsamkeit, die ich bisher feststellen kann, ist, dass bisher keine negativen Zahlen (die durchaus vorkommen können) den Fehler aufweisen und die meisten Zahlen nur eine Nachkommastelle haben (allerdings nicht alle, ich weiß von mindestens 2 Zahlen, die auch 2 oder 3 Nachkommastellen haben, sie sind nur in der liste nicht enthalten).
Auch wurde bei allen Nachrechnungen, die ich bis jetzt gemacht habe, die Variable absolutePosition, aus der sich die anderen Variablen herleiten immer korrekt berechnet und gerundet, weshalb mir unbegreiflich ist, wo das Programm diese Werte hernimmt.
Ich hoffe jemand von euch hat einen schlauen Einfall, weil ich mit meinem Latein wirklich am Ende bin. Ich bedanke mich schon im Voraus für alle hilfreichen Hinweise.
PS: Bevor es jemand erwähnt, ich weiß, dass da viel mehr Kommas drin sind, als eigentlich notwendig, aber ich wollte lieber auf Nummer sicher gehen. :bae:
ich habe ein sehr seltsames Problem und kann mir einfach nicht erklären woran es liegt. Vermutlich wieder eine von diesen Sachen, wo man sich später gegen den Kopf schlägt, dass man nicht früher drauf gekommen ist...
Ich habe ein Programm, in dem der Benutzer in verschiedene Textfelder Zahlen eingibt, diese werden ausgelesen, wenn der Benutzer einen Button drückt und dann an den Konstruktor einer Schiff-Klasse übergeben:
[JAVA=1044]class Schiff
{
String bezeichnung;
int partikelAngriff;
int energieAngriff;
int schilde;
int panzer;
int antrieb;
int hitpoints;
Integer position1;
Integer position2;
Integer position3;
Integer position4;
Integer position5;
Integer position6;
Integer position7;
double absolutePosition;
boolean zerstört;
boolean gereiht;
public Schiff(String bezeichnung, int partikelAngriff, int energieAngriff, int schilde, int panzer, int antrieb, int hitpoints)
{
this.bezeichnung = bezeichnung;
this.partikelAngriff = partikelAngriff;
this.energieAngriff = energieAngriff;
this.schilde = schilde;
this.panzer = panzer;
this.antrieb = antrieb;
this.hitpoints = hitpoints;
absolutePosition = ((double)(this.partikelAngriff + this.energieAngriff)) - (((double)this.antrieb) / ((double)this.hitpoints));
if(absolutePosition > 0)
{
absolutePosition = ((int)((absolutePosition * 10000) + 0.5)) / 10000.0;
}
if(absolutePosition < 0)
{
absolutePosition = ((int)((absolutePosition * 10000) - 0.5)) / 10000.0;
}
position1 = (int)(absolutePosition / 100);
position2 = ((int)(absolutePosition / 10)) - (((int)(absolutePosition / 100)) * 10);
position3 = ((int)absolutePosition) - (((int)(absolutePosition / 10)) * 10);
position4 = ((int)(absolutePosition * 10)) % 10;
position5 = ((int)(absolutePosition * 100)) % 10;
position6 = ((int)(absolutePosition * 1000)) % 10;
position7 = ((int)(absolutePosition * 10000)) % 10;
}[/code]
Nun wollte ich an ein paar Beispiel-Werten testen, ob die Werte für die Variablen absolutePosition und position1 bis position7 richtig berechnet werden und keine Rundungsfehler auftreten.
In den meisten Fällen funktioniert das auch und ich bekomme die richtigen Werte. Bei einigen Fällen fiel mir aber auf, dass plötzlich an Stellen, die eine 0 aufweisen sollten, eine 9 stand und wenige Male auch bei Stellen mit einer 5 eine 4.
Ich habe auch einige Werte durchgetestet, um zu sehen, ob die Werte irgendwelche markanten Gemeinsamkeiten haben, die auf den Fehler hinweisen könnten, konnte bis jetzt aber nicht fündig werden. Hier meine Beispielwerte (die erste Zahl ist der Wert absolutePosition, die zweiten die Werte von position1 - position7 hintereinander):
2,3 0023900
4,1 0041900
4,6 0046900
5,1 0059100
8,2 0082900
8,7 0087900
9,7 0097900
10,2 0102900
16,4 0164900
16,9 0169900
19,9 0199900
20,4 0204900
32,3 0323990
32,8 0328900
33,3 0333900
40,3 0403900
40,8 0408900
64,1 0641990
64,6 0646990
65,1 0651990
65,6 0656900
66,1 0661900
81,1 0811900
81,6 0816900
128,2 1282990
128,7 1287990
130,2 1302990
130,7 1307990
131,2 1312900
131,7 1317900
163,2 1632900
163,7 1637900
256,4 2564990
256,9 2569990
261,4 2614990
261,9 2619990
262,4 2624900
262,9 2629900
326,9 3269900
327,4 3274900
512,3 5123990
512,8 5128990
523,3 5233990
523,8 5238990
524,3 5243900
524,8 5248900
654,8 6548900
655,3 6553900
Die einzige Gemeinsamkeit, die ich bisher feststellen kann, ist, dass bisher keine negativen Zahlen (die durchaus vorkommen können) den Fehler aufweisen und die meisten Zahlen nur eine Nachkommastelle haben (allerdings nicht alle, ich weiß von mindestens 2 Zahlen, die auch 2 oder 3 Nachkommastellen haben, sie sind nur in der liste nicht enthalten).
Auch wurde bei allen Nachrechnungen, die ich bis jetzt gemacht habe, die Variable absolutePosition, aus der sich die anderen Variablen herleiten immer korrekt berechnet und gerundet, weshalb mir unbegreiflich ist, wo das Programm diese Werte hernimmt.
Ich hoffe jemand von euch hat einen schlauen Einfall, weil ich mit meinem Latein wirklich am Ende bin. Ich bedanke mich schon im Voraus für alle hilfreichen Hinweise.
PS: Bevor es jemand erwähnt, ich weiß, dass da viel mehr Kommas drin sind, als eigentlich notwendig, aber ich wollte lieber auf Nummer sicher gehen. :bae: