# Double: Grenzen und Darstellung



## Donut (9. Okt 2005)

Noch ein Problem:

1. Wie kann ich einen Double-Wert übersichtlich darstellen?
Ich hab jetzt erstmal den Wert in einem JLabel ins Fenster gepackt. Nur dann sieht das so aus:
Bei einem "kleinen" Wert: 45724.0
Bei einel großen Wert: 4.454645187E29

Der eigentlich Wert ist auch richtig und so, nur möchte ich da stehen haben:
bei kleinen: 45724
bei großen: 4.45x10^29 (und die ^29 möglichst noch wirklich im Exponent)

Wie mach ich das?

2. Gibt es irgendeine Möglichkeit etwas höheres als double zu speichern? bzw. macht das Sinn? Gut kommt warsch auf  
den Kontext an. Meiner ist folgender:
Bei jedem Durchgang wird
1. 2 boolsche Werte verglichen, und das bis zu 200.000-mal (is schon gut gerechnet)
2. 4 boolsche Werte umgeschrieben, bis zu 10.000-mal

    macht es Sinn, dies öfter durchzuführen, als die Double-Variable einen Wert speichern kann? Wie lange dauert sowas?


----------



## The_S (10. Okt 2005)

Wenn du größer als Double speichern möchtest, dann schau dir mal BigDecimal an. Beim formatieren wird dir DecimalFormat helfen.


----------



## Bleiglanz (10. Okt 2005)

du willt ^29 hochstellen? als Exponent?

wo und wie gibst du das denn aus, auf der Konsole dürfte das z.B. schwierig sein...

ggf. enthält die "normale Ausgabe" ein E29, also musst du wohl das E durch 10^ ersetzen


----------



## Donut (14. Okt 2005)

das ganz soll irgendwie in einen JPanel.
Ich habs im Moment als JLAbel gemacht, vielleicht brauch ich aber ja auch was anderes, um folgendes darzustellen:

aus : 54.2214876E2 (double)
soll werden : 54,2*10² (String)

(und natürlich nicht nur mit *10², sondern auch mal höhere Exponenten bei der 10)


----------



## 0xdeadbeef (16. Okt 2005)

In so ziemlich allen Swing-Komponenten (also insbesondere auch JLabels/JButtons) kann man im Konstruktor bzw. per "setText" HTML-formatierte Strings übergeben.

label.setText("<html>54,2*10<sup>2</sup></html>");

Zu Deinem Algorithmus: mir ist noch nicht so ganz klar, was Du da eigentlich machst. Dir sollte aber bewußt sein, daß ein Double zwar einen sehr großen Wertebereich hat, daß es aber keine Garantie dafür gibt, daß eine bestimmte Zahl damit auch exakt dargestellt werden kann. Immerhin gibt es trotz des im Vergleich zu einem Long viel größeren Wertebereichs auch nur 2^64 mögliche Zahlenwerte (bzw. sogar ein paar weniger). Entsprechend gibt es da nach oben und unten hin immer größer aufklaffende "Lücken" an Zahlen, die alle durch das gleiche Bitmuster repäsentiert werden müssen.

Wenn Du also über den Wertebereich von Long (max. ca.  9.223e+18) hinaus Integerwerte benötigst bzw. sogar Bitverschiebereien betreibst, würde ich Dir dringend zur Klasse BigInteger raten.


----------



## Donut (16. Okt 2005)

hm joa BigInteger leuchtet ein, zumal ich ja gar keine Fließkommazahlen haben will.

Ich hab die Variable jetzt in einen BigInteger gepackt, und das geht auch soweit. Nur mit der Formatierung für die Anzeige hab ich noch Probleme:
Wie soll ich dem sagen, dass er bei der Zahl z.b. 123456789 (jetzt ein kurzes Beispiel der Übericht wegen) nur die ersteb beiden nehmen soll, und wie bekomm ich raus wieviele Ziffern er damit weggeschnitten hat, damit 12*10^7 rauskommt?
(ich brauche also: Die ersten beiden ziffern: 12 ; Weggeschnitten: 7)
Oder anders gefragt: Wie bekomme ich raus, wieviel Stellen ein BigInteger hat? (durch 10^soviel teilen, Nachkommastellen wegscheiden, *10^soviel hinzufügen)

Die Anzeige ist damit natürlich nich exakt. Doch das ist gar nicht nötig, da es nur eine Größenordung angeben soll. (Sie kann z.b. auch =24 sein)


----------



## 0xdeadbeef (16. Okt 2005)

Na ja, wenn Du z.B, maximal 12 Stellen in der Mantisse anzeigen möchtest, mußt Du ja bloß prüfen, ob Deine Zahl > 999999999999 ist. Falls nein: normal anzeigen, ansonsten mußt Du halt den Exponenten ausrechnen.

Wenn Du z.B. eine Zahl N mit 25 Stellen hast, ist das 0.N*10^25:

1234567890123456789012345
-> 0.123456789012345789012345e+25

Jede Zahl, die Du vor das Komma ziehst, erniedrigt den Exponenten um 1.
Also ergibt sich für 12 Zeichen vor dem Komma ein Exponent von 25-12 = 13

123456789012e+13 bzw. 123456789012*10^13


Also kurz zusammengefaßt:
1) wandle den BigInteger per toString in einen String und zähle die Zeichen. Falls <= 12 Zeichen, weiter mit 4)
2) Berechne den Exponenten als strLen-12
3) Bestimme die Mantisse als subString(0,12)
4) Ausgeben


----------



## Donut (16. Okt 2005)

ach klar *batsch*

String.length() - einfach aber effektiv, so gehts
danke


----------

