2017-09-12 2 views
0

Ich habe ..BigDecimal - wie diese Berechnung in Java tun

target = targetmax/Schwierigkeit

targetmax = 26959535291011309493156476344723991336010898738574164086137773096960

Schwierigkeit = 14484,162361

target = 26959535291011309493156476344723991336010898738574164086137773096960/14.484,162361

Ziel = 186131131 5012765306929610463010191006516769515973403833769533170

So habe ich versucht, dies in Java als

double difficulty = 14484.162361; 

    String targetmaxStr = "26959535291011309493156476344723991336010898738574164086137773096960"; 

    BigDecimal targetmaxd = new BigDecimal(targetmaxStr); 

    BigDecimal difficultyd = new BigDecimal(difficulty); 

    BigDecimal targetd = targetmaxd.divide(difficultyd, MathContext.DECIMAL128); 

    System.out.println("target : " + targetD); 

Er druckt

Ziel: 1.861311315012765229690386592708552E + 63

ich wirklich Wert erwarten:

target = 1861311315012765306929610463010191006516769515973403833769533170

+1

Es ist kein Duplikat dieser Frage. –

+0

@MatthewMcPeak Ich glaube wirklich, dass es ist. Die Diskrepanz wird durch die Verwendung des 'BigDecimal (double)' -Konstruktors verursacht - was diese andere Frage adressiert. –

+0

Sie haben Recht, es ist eine Kombination von Problemen. Das Erstellen von "Schwierigkeiten" aus einem Doppel verursacht eine Ungenauigkeit, wie es die Probleme sind, auf die ich in meiner Antwort hingewiesen habe. Ich werde meine Antwort auf Vollständigkeit aktualisieren. –

Antwort

2

Sie haben drei Probleme.

Verwenden Sie zuerst targetd.toPlainString()), um die BigDecimal auszudrucken und dabei die wissenschaftliche Notation zu vermeiden.

Zweitens begrenzen Sie Ihre Genauigkeit zu sehr, indem Sie MathContext.DECIMAL128 verwenden. Versuchen Sie etwas wie new MathContext(200) stattdessen.

Drittens, wie in den Kommentaren diskutiert wurde, erstellt Ihre BigDecimal von einem double schafft einige Genauigkeitsprobleme. Erstellen Sie stattdessen eine String, um diese zu vermeiden.

Hier ist alles zusammen:

String targetmaxStr = "26959535291011309493156476344723991336010898738574164086137773096960"; 
BigDecimal targetmaxd = new BigDecimal(targetmaxStr); 
BigDecimal difficultyd = new BigDecimal("14484.162361"); 
BigDecimal targetd = targetmaxd.divide(difficultyd, new MathContext(200)); 
System.out.println("target : " + targetd.toPlainString()); 

Ergebnis:

Ziel: 1861311315012765306929610463010191006516769515973403833769533170,5181511669744807274464658288015444595719414139754270599065953124329244737606680298383048483144520034008751609022370030307892100271382756

+0

Danke Matthew, aber irgendwie stimmen nur die ersten 15 Ziffern mit den Antwort- und Ruheziffern nicht überein. – Jagdish

+0

Haben Sie mit meinem Update re verglichen: der 'BigDecimal (double)' Konstruktor? –

+0

Ah, das hat funktioniert .. Vielen Dank – Jagdish