Transformation zweier Integer in ein Double

J

jono

Top Contributor
Aufgabe:
Implementieren Sie eine statische-public Methode mit dem Namen „createDouble“ in der Klasse "Functionality.java". Die Methode bekommt zwei Integer-Werte a und b als Eingabe und soll diese wie folgt zu einem Double-Wert transformieren und zurückgeben: Der erste Eingabewert a, soll vor dem Komma bzw. Punkt stehen. Der zweite Eingabewert b, soll nach dem Komma bzw. Punkt stehen und überflüssige Nullen sollen entfernt werden.

Es dürfen keine Imports verwendet werden, um diese Aufgabe zu lösen. Auch die Verwendung der Math-Bibliothek oder anderen Bibliotheken ist untersagt. Implementieren Sie einen Algorithmus, der mindestens eine sinnvolle Schleife enthält. Gegebenenfalls müssen Sie mathematische Methoden selbst implementieren.

Hierzu ist mir die Lösung des Problems nur durch Double.parseDouble gelungen. Jedoch sollen ja keine Bibliotheken verwendet werden und eine Schleife findet keine Verwendung bei meiner Lösung. Kann mir da evtl. bitte einer einen Ansatz geben ?
 
T

thecain

Top Contributor
Wie wärs mit multiplizieren und dividieren um Faktor 10, sowie eine Addition. Um mal einen Hinweis zu geben.
 
BestGoalkeeper

BestGoalkeeper

Top Contributor
am schnellsten wohl so:
Java:
    public static double createDouble(int a, int b) {
        return a + b / Math.pow(10, (int) Math.log10(b) + 1);
    }
 
BestGoalkeeper

BestGoalkeeper

Top Contributor
Oje, ja, es gibt da mehrere Wege...
System.out.println(createDouble(12, 4567001)); //=> 12.4567001
 
J

jono

Top Contributor
Wie wärs mit multiplizieren und dividieren um Faktor 10, sowie eine Addition. Um mal einen Hinweis zu geben.
Bsp.:
(12, 12)
Die beiden miteinander multipliziert ergeben 144.
Dividiert durch 10 ergibt 14,4. Wie bringe ich jetzt eine Addition ein, sodass ich auf ein Ergebnis entsprechend des Beispiels von 12.12 komme.
Ich weiß ja nicht, ob deine Aussage der Reihenfolge entspricht, in der ich vorgegangen bin.
 
kneitzel

kneitzel

Top Contributor
Wenn du also einer Zahl 1 eine 0.1 machen willst: qas wäre da die Operation?

Und aus der Zahl 12 die 0.12: was ist da die Operation?

Und bei der Zahl 123 die 0.123 ... was musst du da machen?

Kannst du, wenn du diese Operationen betrachtest, das als als immer gleiche Operation darstellen und gibt es dann eine Abbruchbedingung?

Evtl. auch einfach mal ein Begriff, der weiter helfen könnte: Kommaverschiebung...
 
J

jono

Top Contributor
Kannst du, wenn du diese Operationen betrachtest, das als als immer gleiche Operation darstellen und gibt es dann eine Abbruchbedingung?
Eine immer Gleiche würde mir da jetzt nicht einfallen...
Aber es werden nach deinen Beispielen nach die Zahlen durch 10, 100 u. 1000 dividiert um das Komma zu verschieben.
Mir ist bewusst was eine Abbruchbedingung ist, aber wüsste nicht die konkret anzuwenden bei der Aufgabe..
 
kneitzel

kneitzel

Top Contributor
Vielleicht war mein Beitrag auch etwas irreführend, weil ich Dein Augenmerk bei den Beispielen auf jeweils eine Operation gelenkt habe.
Du hast die Division durch 10, 100, 1000, u.s.w. Kannst Du die Operationen alle durch eine ausdrücken? Also nehmen wir die Division durch 100: Kannst Du mit Division durch 10 darstellen?

Oder die Alternative: Betrachten wir es mit dem Stichwort "Komma verschieben".

Das Komma um eine Stelle verschieben. Was für eine Operation wäre dies?
Und dann die Frage: Wie lange musst Du das Komma verschieben? Wann wärst Du fertig?
 
J

jono

Top Contributor
Also nehmen wir die Division durch 100: Kannst Du mit Division durch 10 darstellen?
Wenn wir 12 durch 100 dividieren, erhalten wir 0.12 und dividiert durch 10 = 1.2 ... Dementsprechend fällt mir schwer, die Division durch 100 mit der Division durch 10 darzustellen...

Das Komma um eine Stelle verschieben. Was für eine Operation wäre dies?
Dividiert durch 10.

Und dann die Frage: Wie lange musst Du das Komma verschieben? Wann wärst Du fertig?
Das kann ich nicht genau sagen. Die Frage, die mir erst in den Sinn kommt ist: Wie bringe ich die beiden Integer-Werte zusammen ...
 
kneitzel

kneitzel

Top Contributor
Ok, nehmen wir die 12: Du hast gesagt: Die muss durch 100 geteilt werden.

12 durch 10 geteilt ist 1,2; die 1,2 durch 10 geteilt ist 0,12.
==> Durch 100 teilen ist also zwei Mal durch 10 Teilen.

Also könnte man so lange durch 10 Teilen, bis man fertig ist.

123 / 1 = 12,3 -> Sind wir fertig? An was erkennst Du, dass wir noch nicht fertig sind?

Die Frage, die mir erst in den Sinn kommt ist: Wie bringe ich die beiden Integer-Werte zusammen ...
Sorry, da haben wir wohl etwas vorausgesetzt, das Dir noch nicht klar war.

Ich habe immer nur die zweite Zahl betrachtet, die ich verändern wollte, damit sie dann anschließend in einer Addition verwendet werden kann.

Wenn du die Zahlen 123 und 456 hast, dann soll ja 123,456 heraus kommen.
Und die Addition, die sich da anbietet: 123 + 0,456 - die erste Zahl ist unverändert, also haben wir die nicht betrachtet. Aber die Zweite Zahl muss ja umgewandelt werden. Aus 456 muss ja die 0,456 werden...
 
J

jono

Top Contributor
123 / 1 = 12,3 -> Sind wir fertig? An was erkennst Du, dass wir noch nicht fertig sind?
Das erkennen wir daran, dass eine Zahl x >=100 immer mit 1000 dividiert werden muss. Dementsprechend eine 3-malige Division durch 10.
Eine Zahl x < 10 muss nur 1 mal durch 10 dividiert werden und eine Zahl 10 <= x < 100 wird durch 100 dividiert. Problem aus meiner Sicht jetzt:
Der Integer-Wertebereich ist ja schon sehr groß, wie implementiere ich jetzt am besten eine for-Schleife, die alles abdeckt..? Ich denke, dass eine Schleife auch nicht ausreichen würde.
 
kneitzel

kneitzel

Top Contributor
Also du hast erkannt: Zahlen müssen ggf. mehrmals durch 10 dividiert werden. Statt Regeln aufzustellen, wie oft eine Zahl in einem bestimmten Bereich durch 10 dividiert werden muss, wollen wir ja eine Schleife.

Wir dividieren also so lange durch 10, bis das Ergebnis so ist, wie wir es wollen. Und fertig sind wir doch, wenn eine 0 vor dem Komma steht. 0 vor dem Komma bedeutet, dass wir durch 10 teilen, so lange wie der Wert >= 1 ist:

Java:
double nachkomma = zahl2;
while (nachkomma >= 1) {
    nachkomma = nachkomma / 10;
}
 
T

thecain

Top Contributor
Wir dividieren also so lange durch 10, bis das Ergebnis so ist, wie wir es wollen. Und fertig sind wir doch, wenn eine 0 vor dem Komma steht. 0 vor dem Komma bedeutet, dass wir durch 10 teilen, so lange wie der Wert >= 1 ist:
Jetzt hat ers geschafft ohne denken und du hast es ihm fast vorgelöst...
 
BestGoalkeeper

BestGoalkeeper

Top Contributor
Wäre das zulässig?
Java:
    public static double createDouble(int a, int b) {
        return Double.parseDouble(a + "." + b);
    }
 
BestGoalkeeper

BestGoalkeeper

Top Contributor
Also man könnte das so machen
Java:
    public static double createDouble(int a, int b) {
        double decimalPlace = b;
        while (b != 0) {
            b /= 10;
            decimalPlace /= 10;
        }
        return a + decimalPlace;
    }
das ist aber ungenau: createDouble(12, 4567001) => 12.456700099999999

Du müsstest das noch etwas umstellen.
 
BestGoalkeeper

BestGoalkeeper

Top Contributor
Java:
    public static double createDouble(int a, int b) {
        double c = b;
        double d = 1;
        while (c >= 1) {
            c /= 10;
            d *= 10;
        }
        return a + b/d;
    }

    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
        System.out.println(createDouble(12, Integer.MAX_VALUE));
    }
 
kneitzel

kneitzel

Top Contributor
Warum den Parameter noch verändern? Die Schleife funktioniert doch super ohne dass man b verändern muss (Und wurde ja in #15 schon gezeigt).

Und die Ungenauigkeit ist ja verständlich - denn im dual-System sind so Zahlen ja nicht 1:1 abbildbar. Die Genauigkeit verbessert sich daher nur minimal bei der zweiten Lösung. Aber man könnte natürlich die Anzahl der Stellen mit zählen und dann hätte man bei der Anzeige sozusagen wieder eine Rundung auf die gewünschte Anzahl Stellen.
 
BestGoalkeeper

BestGoalkeeper

Top Contributor
kneitzel

kneitzel

Top Contributor
Quatsch, wahrscheinlich ist die zweite für alle Zahlen zwischen 0<=b<=max_int genau...
Also mit dem Verständnis, wie die Zahlen abgebildet werden, ist das kein Quatsch. Aber man kann einfach einmal eine Schleife bauen, die das z.B. für alle Zahlen abbildet....

1,i war der Aufruf. Und die Ausgabe zeigt i, Dein genaues Ergebnis, Das ungenaue Ergebnis:
119425, 1.1194250000000001 1.119425
119471, 1.1194709999999999 1.119471
119533, 1.1195330000000001 1.119533
119622, 1.1196220000000001 1.119622
119722, 1.1197219999999999 1.119722
119730, 1.1197300000000001 1.11973
119784, 1.1197840000000001 1.119784
119838, 1.1198380000000001 1.119838
119865, 1.1198649999999999 1.119865
119919, 1.1199189999999999 1.119919
119927, 1.1199270000000001 1.119927
119981, 1.1199810000000001 1.119981
120027, 1.1200269999999999 1.120027
120035, 1.1200350000000001 1.120035
120089, 1.1200890000000001 1.120089
120224, 1.1202239999999999 1.120224
120332, 1.1203319999999999 1.120332
120483, 1.1204830000000001 1.120483
120637, 1.1206369999999999 1.120637
120788, 1.1207880000000001 1.120788
120942, 1.1209419999999999 1.120942
121004, 1.1210040000000001 1.121004
121093, 1.1210930000000001 1.121093
121201, 1.1212010000000001 1.121201
121247, 1.1212469999999999 1.121247
121255, 1.1212550000000001 1.121255
121336, 1.1213359999999999 1.121336
121390, 1.1213899999999999 1.12139
121398, 1.1213980000000001 1.121398

Ich habe natürlich die Fälle gefiltert, wo die genaue Version ungenauer ist, wie die ungenaue Variante....

==> Was auch zeigt, dass Optimierungen ohne Analyse schlicht Unsinn sind. :)

Aber für 1 - 100.000 ergibt sich diese Fälle:
- 8784 mal ist die genaue Variante ungenauer
- 9647 mal ist die ungenaue Variante ungenauer

Also ja: etwas genauer ist die verbesserte Variante, aber nicht wirklich so stark und nicht wirklich immer genau! Und wenn man das mit dem genauen Wert vergleicht, dann ist es in 26454 Fällen nicht genau (Bei Werten bis 100.000).

und primitive Parameter kannst du in Java problemlos verändern... das schadet keinem.
Ich habe doch nicht behauptet, dass dies nicht geht. Nur ist das alles unnötig, eine vernünftige Variante gab es doch schon ...
 
BestGoalkeeper

BestGoalkeeper

Top Contributor
Aber wahrscheinlich ist die genaue etwas genauer als die ungenaue. Außerdem habe ich nicht behauptet, die sei für alle genau, ich habe "wahrscheinlich" geschrieben.

Bin mir nicht sicher, ob es, anstatt an der Rechenoperation, wirklich an der internen Zahlendarstellung liegt, dass es zu Ungenauigkeiten kommt.

sysout(1.8784) und sysout(1.9647) müsste dann eigentlich etwas Schiefes ausgeben, was ich aber nicht glaub.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Verstaendnisfrage Java2D, Affine Transformation, Rendering Java Basics - Anfänger-Themen 4
A Ablauf von Bytecode Transformation Java Basics - Anfänger-Themen 10
D Interaktion zweier Objekte Java Basics - Anfänger-Themen 5
H Gemeinsame Schnittmenge zweier Arrays ausgeben Java Basics - Anfänger-Themen 12
F Erstellen zweier Objekte mit dem selben Inhalt Java Basics - Anfänger-Themen 1
K Datentypen Einträge zweier Matrizen vergleichen Java Basics - Anfänger-Themen 4
K Erste Schritte Berechnung der Summe zweier Arrays Java Basics - Anfänger-Themen 15
S Vergleich zweier ArrayLists mit Ausgabe an dritte ArrayList Java Basics - Anfänger-Themen 5
I Schnittpunkt zweier Geraden berechnen Java Basics - Anfänger-Themen 25
G Klassen Vergleich zweier Klassen Java Basics - Anfänger-Themen 23
S Implementieren zweier Klassen Java Basics - Anfänger-Themen 5
P Ungerade Zahlen ausgeben lassen zwischen Spannweite zweier eingegeben zahlen Java Basics - Anfänger-Themen 6
L Vergleich zweier Variablen, mit Abweichung Java Basics - Anfänger-Themen 3
N Methoden Methode zum Vergleich zweier Geburtstage Java Basics - Anfänger-Themen 5
K Multiplikation zweier Matrizen Java Basics - Anfänger-Themen 23
D Zusammenfassen zweier Programme Java Basics - Anfänger-Themen 3
B Kreuzprodukt zweier Vektoren (Erste Java Aufgabe - Hilfestellungen und Tips erwünscht) Java Basics - Anfänger-Themen 4
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
L BufferdImage schwarzes Bild nach zusammenfügen zweier Bilder Java Basics - Anfänger-Themen 8
N Vergleich zweier String Arrays scheitert Java Basics - Anfänger-Themen 3
C Proportionale Abnahme zweier Werte Java Basics - Anfänger-Themen 4
O ArrayListe sortieren anhand zweier Parameter Java Basics - Anfänger-Themen 4
C Inhalte zweier Vektoren vergleichen Java Basics - Anfänger-Themen 3
T Programm, das die Differenz zweier Daten ausgibt Java Basics - Anfänger-Themen 4
S Ermittlung des GGTs zweier Werte Java Basics - Anfänger-Themen 5
Y Erste Schritte Verknüpfung zweier JAVA-Codes Java Basics - Anfänger-Themen 8
A Methoden Gedanken Anstöße zur Realisierung zweier Ideen (Grafisch Sekunden zählen und Frameaufteilung) Java Basics - Anfänger-Themen 18
I Einlese Abfrage zweier Variablen in einem Fenster Java Basics - Anfänger-Themen 6
A Durchschnitt zweier Mengen berechnen Java Basics - Anfänger-Themen 3
G Kombination zweier Befehle (Preis festlegen & Rabatt berechnen) Java Basics - Anfänger-Themen 3
W Methoden größe zweier tiere vergleichen Java Basics - Anfänger-Themen 15
K Schnitt zweier Ebenen ergibt Gerade Java Basics - Anfänger-Themen 10
L vergleich zweier texte Java Basics - Anfänger-Themen 18
B Vergleich zweier Objekte durch "Hashfunktion" Java Basics - Anfänger-Themen 12
J Addition zweier Zahlen Java Basics - Anfänger-Themen 9
J Dimensionen zweier Arrays vergleichen Java Basics - Anfänger-Themen 4
U Größenvergleich / Dimensionsvergleich zweier Matrizen Java Basics - Anfänger-Themen 2
N Datenaustausch zweier rechner Java Basics - Anfänger-Themen 4
turmaline Gleicheit zweier Listen Java Basics - Anfänger-Themen 12
S Print Methode zweier "Classes" kombinieren Java Basics - Anfänger-Themen 2
C Dateiinhalt zweier Dateien auf Gleichheit prüfen Java Basics - Anfänger-Themen 3
S Addition zweier 32 Byte langer ByteArrays Java Basics - Anfänger-Themen 5
W Unterschiede zweier Dateien herauslesen Java Basics - Anfänger-Themen 7
P Unterschiede zweier System.in Varianten Java Basics - Anfänger-Themen 3
I Abhängigkeiten zweier Klassen Java Basics - Anfänger-Themen 25
G Vergleich zweier Arrays Java Basics - Anfänger-Themen 8
D Eine Nachkommazahl zweier Double vergleichen Java Basics - Anfänger-Themen 4
N sortieren zweier abhängiger array listen Java Basics - Anfänger-Themen 12
S Addieren zweier Arrays Java Basics - Anfänger-Themen 10
T ermittlung des minimus zweier eingegebener werte Java Basics - Anfänger-Themen 7
G größere zweier zahlen ermitteln und ausgeben Java Basics - Anfänger-Themen 6
G Summe zweier doubles falsch? Java Basics - Anfänger-Themen 10
I Kollision zweier Rechtecke Java Basics - Anfänger-Themen 9
H Genauigkeit beim Multiplizieren zweier Zahlen Java Basics - Anfänger-Themen 2
K Vergleich zweier Objekte in einer HashMap Java Basics - Anfänger-Themen 6
B Zusammenspiel zweier JFrames Java Basics - Anfänger-Themen 2
A Schnitt zweier Rechtecke ermitteln Java Basics - Anfänger-Themen 2
N Vergleich zweier Elemente verschiedener Vectoren Java Basics - Anfänger-Themen 2
G Vergleich zweier 'long'-Werte. Problem! Java Basics - Anfänger-Themen 6
T Inhalte zweier Variablen tauschen Java Basics - Anfänger-Themen 18
U Maximum zweier Zahlen ermitteln Java Basics - Anfänger-Themen 7
N Den Inhalt zweier Strings (Zahlen) addieren Java Basics - Anfänger-Themen 5
S maximum zweier Zahlen Java Basics - Anfänger-Themen 1
M Integer aus aus einer Klasse in andere speichern Java Basics - Anfänger-Themen 12
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
D Fibonacci overflow integer Java Basics - Anfänger-Themen 8
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
S Integer Wert wird nicht übernommen Java Basics - Anfänger-Themen 2
V int zu Integer und String Java Basics - Anfänger-Themen 6
H Datentypen Was für eine Format verbirgt sich hinter dem Integer-Wert 053? Java Basics - Anfänger-Themen 2
L Baum aus Integer Liste erstellen Java Basics - Anfänger-Themen 0
M Regex zum Integer.parseInt Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
S Vergleichen ob der Integer der benutzt eingeben werden soll überhaupt ein int ist Java Basics - Anfänger-Themen 1
S Letzte Zahl eines Integer auslesen? Java Basics - Anfänger-Themen 3
K String in Integer umwandeln Java Basics - Anfänger-Themen 4
G Überprüfen ob alle Ziffern von 1-9 in einem Integer vorhanden sind Java Basics - Anfänger-Themen 6
D integer negativen Wert abspeichern Java Basics - Anfänger-Themen 3
A Mit JComboBox Ergebnis einen Integer aus einer anderen Klasse aufrufen. Java Basics - Anfänger-Themen 2
J Methoden Moving a n integer matrix Java Basics - Anfänger-Themen 3
R Eingabe String umwandeln zu Integer Werten Java Basics - Anfänger-Themen 8
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
J Erhöhen eines Values als Integer bei gleichen Keys in HashMap Java Basics - Anfänger-Themen 12
UnknownInnocent Datentypen Integer ArrayList sortieren Java Basics - Anfänger-Themen 2
J Methoden Equals Methode für Integer und Objekte überschreiben? Java Basics - Anfänger-Themen 9
UnknownInnocent Bestimmten Integer Wert aus Array filtern Java Basics - Anfänger-Themen 2
L String in Integer umwandeln Java Basics - Anfänger-Themen 3
K Datentypen String zu Integer parsen Java Basics - Anfänger-Themen 2
B Liste von Integer -> Nächster Wert bekommen Java Basics - Anfänger-Themen 5
S Integer aus Array filtern Java Basics - Anfänger-Themen 4
F Referenzvariable vom Typ "Integer" definieren. (Klausuraufgabe) Java Basics - Anfänger-Themen 5
M set Integer bzw. set null mit SQL DB Java Basics - Anfänger-Themen 9
H Bubblesort-Zwei Integer auf Dekade vergleichen. Java Basics - Anfänger-Themen 6
B Variablen integer im Array Java Basics - Anfänger-Themen 5
C Liste o.ä. erstellen mit <Integer, <Integer, String> Java Basics - Anfänger-Themen 7
R Kompletten String umwandeln in Integer Java Basics - Anfänger-Themen 10
H 32-Bit Zahl (Integer) in eine IPv4 Adresse umwandeln? Java Basics - Anfänger-Themen 2
Orkanson Datentypen Integer in String umwandeln/hinzufügen Java Basics - Anfänger-Themen 3
O Datentypen Integer mit führender Null Java Basics - Anfänger-Themen 13
M Argument in Integer verwandeln und das Doppelte davon printen Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Anzeige

Neue Themen


Oben