Gleitkomma zahlen mathemathisch korrekt multiplizieren

eclipseworker

Bekanntes Mitglied
Ich habe eine Problemstellung wo es erforderlich ist, dass 2 Kommazahlen so weit es geht mathematisch korrekt multipliziert werden, also dass 7,6*1,4 gleich 10,64 ergibt und nicht 10,63999999 oder so etwas ergibt.
Ich habe mir eine Hilfsfunktion gebastelt, die darauf beruht, dass ganze Zahlen richtig gerechnet werden:
Java:
    public double multiPerfect(double a, double b){
         //Bestimmung viele Stellen beide Zahlen hinter dem Komma haben
        String as=""+a;
        String bs=""+b;
        int nka=as.substring(as.indexOf('.')+1, as.length()).length();
        int nkb=bs.substring(bs.indexOf('.')+1, bs.length()).length();
       //10 hoch die Längere wird der Multiplikator
       double tenM=Math.pow(10, nka);
       if(nka<nkb){
            tenM=Math.pow(10, nkb);
       }
       /* es wird dafür gesorgt, dass die beiden Multiplikanten nur noch
            0 hinter dem Komma haben*/
       double al=a*tenM;
       double bl=b*tenM;
       //das muss bei der Rückgabe kompensiert werden
       return (al*bl)/Math.pow(tenM, 2);
    }
Meine Frage ist ob es elegantere Möglichkeiten gibt?
 
Probier es aus, dann wirst du es schon sehen, ob es funktioniert.
Ja stimmt statt include musste ich import nehmen und das Math war danach überflüssig:
Java:
include java.math.*;
//...
public BigDecimal besseresMulitplizieren(double a, double b){
     BigDecimal abd=new BigDecimal(a);
     BigDecimal bbd=new BigDecimal(b);
     return abd.multiply(bbd);
}
//...
Ok, aber was soll ich machen? Alle Doubles mit BigDecimals ersetzen? Das scheint etwas Ressourcen aufwändig. Die Funktion doubleValue() bringt den Fehler retur.
 
Statt dem Double Konstruktor solltest du den String Konstruktor oder valueOf() nehmen.
Sonst kopierst du nur den ungenauen Double Wert.

Siehe folgendes Beispiel:
Java:
import java.math.BigDecimal;

public class Multiply {

    public static void main(String[] args) {
        BigDecimal a1 = new BigDecimal(7.6);
        BigDecimal b1 = new BigDecimal(1.4);
        System.out.println(a1.multiply(b1));

        BigDecimal a2 = new BigDecimal("7.6");
        BigDecimal b2 = BigDecimal.valueOf(1.4);
        System.out.println(a2.multiply(b2));
    }
}
Code:
10.6399999999999988276044859958347248670811673365659664691426113114491869282574043609201908111572265625
10.64
 

Neue Themen


Zurück
Oben