2017-09-12 5 views
0

.. JeBigDecimal - comment faire ce calcul en Java

target = targetmax/difficulté

targetmax = 26959535291011309493156476344723991336010898738574164086137773096960

difficulté = 14484,162361

target = 26959535291011309493156476344723991336010898738574164086137773096960/14484,162361

target = 186131131 5012765306929610463010191006516769515973403833769533170

J'essayé cela en Java comme

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); 

Il imprime

cible: 1.861311315012765229690386592708552E + 63

Je suis vraiment valeur attends:

target = 1861311315012765306929610463010191006516769515973403833769533170

+1

Il est pas un doublon de cette question. –

+0

@MatthewMcPeak Je crois vraiment que c'est. La différence est causée par l'utilisation du constructeur 'BigDecimal (double)' - qui est ce que cette autre question adresse. –

+0

Vous avez raison, c'est une combinaison de problèmes. Créer une difficulté à partir d'un double crée une inexactitude, tout comme les problèmes que j'ai signalés dans ma réponse. Je vais mettre à jour ma réponse pour l'exhaustivité. –

Répondre

2

Vous avez trois problèmes.

D'abord, utilisez targetd.toPlainString()) pour imprimer le BigDecimal en évitant les notations scientifiques. Deuxièmement, vous limitez votre précision en utilisant MathContext.DECIMAL128. Essayez quelque chose comme new MathContext(200) à la place.

Troisièmement, comme cela a été débattu dans les commentaires, la création de votre BigDecimal à partir d'un double crée des problèmes de précision. Créer à partir d'un String au lieu d'éviter ceux-ci.

Ici, il est tous ensemble:

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()); 

Résultat:

cible: 1861311315012765306929610463010191006516769515973403833769533170,5181511669744807274464658288015444595719414139754270599065953124329244737606680298383048483144520034008751609022370030307892100271382756

+0

Merci Matthew, mais d'une façon ou d'une autre, seuls les 15 premiers chiffres correspondent à la réponse et les chiffres de repos ne le sont pas. – Jagdish

+0

Avez-vous comparé avec ma mise à jour re: le constructeur 'BigDecimal (double)'? –

+0

Ah, ça a marché .. Merci beaucoup – Jagdish