Division von BigInteger soll Gelitkommazahl liefern

Diskutiere Division von BigInteger soll Gelitkommazahl liefern im Java Basics - Anfänger-Themen Bereich.
E

ernst

Hallo allerseits,
da ich mit großen Zahlen wie z.B.
100 ! = 100 * 99* ...
rechnen und auch dividieren muss, benutze ich den Datentyp BigInteger

1) Was ist dazu eher geeignet:
BigInteger oder BigDecimal ?

2)
Wie kann man zwei BigInteger bzw. BigDecimal so dividieren, daß als Wert eine Gleitkommazahl rauskommt, also double oder float ?
Also so etwas wie:
double d;
d = big1 / big2;
d = big1.dividiere(big2);


mfg
ern












BigInteger oder
 
T

temi

Du kannst die Methoden doubleValue() oder floatValue() von BigInteger/BigDecimal verwenden, um dieses in double oder float zu wandeln.

Wird dazu einen Blick in diese Doku und diese.
 
E

ernst

Du kannst die Methoden doubleValue() oder floatValue() von BigInteger/BigDecimal verwenden, um dieses in double oder float zu wandeln.
Wird dazu einen Blick in diese Doku und diese.
Danke für das Feedback.
In der Doku steht:
========================================
public double doubleValue()
Converts this BigInteger to a double. This conversion is similar to the narrowing primitive conversion from double to float as defined in section 5.1.3 of The Java™ Language Specification: if this BigInteger has too great a magnitude to represent as a double, it will be converted to Double.NEGATIVE_INFINITY or Double.POSITIVE_INFINITY as appropriate. Note that even when the return value is finite, this conversion can lose information about the precision of the BigInteger value.
==============================================
Ich will große Zahlen durcheinander dividieren, wie z.B:
500 ! / 400 !

Bekomme ich da Double.POSITIVE_INFINITY
Bzw. wie kann man das vermeiden ?

mfg
ern
 
T

temi

Wenn deine Zahl zu groß ist für ein double, dann ist sie eben zu groß. Was gibt es da noch zu wollen?

Arbeite einfach generell mit BigInteger/BigDecimal. Was ist der Grund für die Konvertierung?
 
E

ernst

Wenn deine Zahl zu groß ist für ein double, dann ist sie eben zu groß. Was gibt es da noch zu wollen?
Arbeite einfach generell mit BigInteger/BigDecimal. Was ist der Grund für die Konvertierung?
big1 / big2 liefert ein BigInteger.

Mein Wunsch ist Folgender:
Es soll eine Methode egeben, die bei
big1 / big2
ein double liefert.

mfg
ern
 
A

advanced_java

Wie meinst du das ?
Ungefähr so
Java:
	public static BigInteger fac(int i1) {
		BigInteger one = BigInteger.ONE;
		while (i1 > 1) {
			one = one.multiply(BigInteger.valueOf(i1--));
		}
		return one;
	}

	public static double div(BigInteger i1, BigInteger i2) {
		return i1.divide(i2).doubleValue();
	}

	public static void main(String[] args) {
		System.out.println(div(fac(40), fac(30)));
	}
 
T

temi

Mein Wunsch ist Folgender:
Es soll eine Methode egeben, die bei
big1 / big2
ein double liefert.
Wie dieser Wunsch erfüllt werden kann steht ja jetzt schon da. Jedes BigInteger/BigDecimal verfügt über die Methode doubleValue(). Da das Ergebnis deiner Division wiederum ein BigInteger/BigDecimal ist, kannst du darauf natürlich ebenfalls diese Methode aufrufen.

Worauf ich hinauswollte war folgendes: Wenn du mit so großen Zahlen operierst, dann solltest du einfach generell mit dem gewählten Datentyp weiterarbeiten und zwar solange, bis es für irgendeine weitere Operation notwendig wird, in einen anderen Datentyp zu konvertieren, wie z.B. zur Anzeige in einen String konvertieren.
 
E

ernst

Ich bin jetzt auf eine Lösung gekommen bzw. so habe ich es gemeint (Genauigkeit auf 2 Stellen):
double d;
BigInteger zähler = new BigInteger("10");
zähler = zähler.multiply(new BigInteger("100"));
BigInteger nenner = new BigInteger("3");
d = zähler.divide(nenner).doubleValue()/100.0;
System.out.println("d="+d);

mfg
ern
 
mihe7

mihe7

Java:
BigDecimal.TEN.multiply(new BigDecimal(100))
    .divide(new BigDecimal(3), RoundingMode.HALF_UP)
    .divide(new BigDecimal(100))
    .doubleValue();
 
mrBrown

mrBrown

Ich bin jetzt auf eine Lösung gekommen bzw. so habe ich es gemeint (Genauigkeit auf 2 Stellen):
Damit löst du das Problem (welches du mit der Lösung hattest, also @temi sie vorgeschlagen hat) allerdings nicht:
Ich will große Zahlen durcheinander dividieren, wie z.B:
500 ! / 400 !

Bekomme ich da Double.POSITIVE_INFINITY
Bzw. wie kann man das vermeiden ?


Bin mir nicht sicher, ob BigInteger gepooled werden
Ist doch völlig irrelevant?
 
F

fhoffmann

Ich will große Zahlen durcheinander dividieren, wie z.B:
500 ! / 400 !
Das Egebnis ist eine (im Dezimalsystem) über 200-stellige Zahl. Was willst du damit?
Und Rechnungen wie
500 ! / 499 ! = 500
kann ich leicht ausführen, wenn ich vorher kürze. Ich muss dafür nicht zunächst zwei über 1000-stellige Dezimalzahlen berechnen und sie dann durcheinander teilen.
 
E

ernst

Ich weiß ja nicht genau, wie oft er solche Berechnungen braucht... Eigentlich ist die komplette Aufgabe noch etwas unklar.
Simulation einer Infektion:
In einer Population mit Anzahl n = k+g , z.B. n=1000) hat es zu Beginn k kranke und g gesunde Personen. Die kranken Personen können die gesunden Personen infizieren.
Deswegen betrachte ich die Anzahl der möglichen Paare KK, KG und GG.
(aus diesen kann man dann die neue Anzahl an kranken und gesunden Personen berechnen).
Wie viele Möglichkeiten gibt es?
Dazu muss man mit grossen Zahlen rechnen.

mfg
ern
 
Thema: 

Division von BigInteger soll Gelitkommazahl liefern

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben