Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ist a teiler von b? mit a und b gebrochene zahlen.
ich hab mal wieder probleme mit gebrochenen zahlen. ich würde gerne wissen ob eine zahl b eine zahl a ohne rest teilen kann. zum beispiel teilt 0.02 die zahl 0.5 denn 25*0.02=0.5.
die anzahl der stellen dieser zahlen weiß ich nicht! es könnte also auch 0.0005 und 0.00002 sein. im moment verwende ich überall Double als typ.
gibt es einen weg zu fragen: ist der rest =0 oder b ist teiler von a? den rest mit 0 vergleichen ist ja prinzipiell problematisch.
entweder durcheinander teilen und (Rundungsfehler bedenken) zufrieden sein, wenn ungefähr eine ganze Zahl rauskommt,
oder alle Zahlen mit 10 multiplizieren, bis sie alle auf int zu casten sind und dann modulo
Mit Double wirst du da wahrscheinlich nicht gluecklich.
Ich wuerde mit java.math.BigDecimal arbeiten, da gibt es dann Methoden wie: BigDecimal.divide(BigDecimal, int, nt)
Wenn du die Parameter scale=0 und roundingMode=ROUND_UNNECESSARY waehlst kommt immer dann wenn der Teiler nicht ganzzahlig ist eine ArithmeticException.
Mit IEEE754 Typen (float, double) wirst Du da nicht weit kommen. 0.5 kann man exakt als float darstellen, 0.2 dagegen nicht. Erzähl mal mehr über Deine Anwendung, in welchem Kontext treten diese Zahlen auf?
danke, dass man nicht double/float verwenden darf hab ich nun wieder schmerzlich erfahren. (bei einer db hab ich auchmal float als format gewählt :-|)
mit big decimal bin ich tatsächlich weitergekommen. man sollte aber den string konstrukto verwenden. also danke für den tip
da ich nicht alles auf bigdecimal umstellen will (im momnet is mir der aufwand zu hoch) hab ich eine funktionierenden workaround:
BigDecimal(doublevalue.toString());
das ergibt in meinem fall (hoffentlich) immer präzise werte, da die "doublevalue" werte auch über bigdecimal enstehen.
direkt den double reinstecke funzt wie gesagt nicht.
letztendlich frag ich mich wofür braucht man überhaupt float und double, sobald man auch nur primitive operationen machen will kommt man damit spätestens beim ersten if in teufels küche.
Ein Workaround BigDecimal(doublevalue.toString()); wird meiner Meinung nach auch nur eingeschraenkt funktionieren, da es nur der interne Formater von Double ist, der bei der Umwandlung in einen String die Nachkommastellen so weit wie moeglich verkuerzt (also in gewisser Weise rundet). Details dazu stehen in der JavaDoc Double.toString(double)
Gleitkommazahlen wie float und double waren immer nur eine pragmatische Loesung um reelle Zahlen naeherungsweise in einer festgelegten Anzahl von Bits abzubilden. Fuer bestimmte Bereiche der Mathematik sind sie meistens ungeeignet, in anderen Anwendungen wie z.B: Grafik- oder Audioberechnungen sind sie dagegen unverzichtbar, vor allem da sich die Rechenoperationen auch komplett in Hardware abbildenlassen.