2017-01-25 4 views
0

I ont deux valeurs doublesSoustraire et les valeurs doubles rondes par le multiplicateur

double a = 1.07522; 
double b = 1.0752; 

et arrondi valeur du multiplicateur

public static final double ROUND_MULTIPLIER = 100000.0; 

Donc, il devrait toujours être 5 décimales. J'ai besoin de soustraire deux valeurs doubles et obtenir le résultat comme a - b = 0.00002.

Comment faire cela en utilisant ROUND_MULTIPLIER?

J'ai essayé d'utiliser BigDecimal comme

BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b)).round(new MathContext((int)ROUND_MULTIPLIER)); 

mais pas toujours fonctionne, revenez parfois 2E-16, il renvoie la valeur bizarre lorsque vous essayez d'ajouter à la seconde valeur ci-dessous

BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b + 0.00002)).round(new MathContext((int)ROUND_MULTIPLIER));

I besoin d'utiliser ROUND_MULTIPLIER.

Répondre

0

Je ne comprends pas pourquoi vous devez utiliser ROUND_MULTIPLYER et quelle est la raison exacte de son existence, donc je ne peux que deviner.

Obliger le code à utiliser ROUND_MULTIPLYER:

public static final double ROUND_MULTIPLIER = 100000.0; 

public void foobar() 
{ 
    double a = 1.07522; 
    double b = 1.0752; 

    BigDecimal opA = BigDecimal.valueOf(a); 
    BigDecimal opB = BigDecimal.valueOf(b); 

    BigDecimal result = opA.subtract(opB); 

    result = result.multiply(BigDecimal.valueOf(ROUND_MULTIPLIER)); 

    int cutResult = result.intValue(); 

    result = BigDecimal.valueOf(cutResult/ROUND_MULTIPLIER); 

    System.out.println(result); 
} 

La sortie de c'est

0.000020 

Est-ce ce que vous voulez? Le code est définitivement objet d'optimisation, mais je vous laisse le soin de le faire ;-)

+0

Cela fonctionne mais il est impossible de doubler le résultat. Quand j'essaie 'result.doubleValue()' il renvoie 2.0E-5 – ACz

+1

Le double primitif sera converti en String via 'Double.toString (double)'. Cela rendra la sortie dans la notation scientifique. Cochez cette question pour une réponse: http://stackoverflow.com/questions/16098046/how-to-print-double-value-without-scientific-notation-using-java – Korashen

+0

Essayé Double.toString (résultat) mais il est retourné le même 2.0E-5 – ACz

0

Utilisez BIGDECIMAL et définir l'échelle donnant le nombre de décimales dont vous avez besoin

final BigDecimal a = new BigDecimal(1.07522); 
    final BigDecimal b = new BigDecimal(1.0752); 
    final BigDecimal result = a.subtract(b); 
    int newScale = 10; //10 decimals 
    System.out.println(result.setScale(newScale, BigDecimal.ROUND_UP)); 
+1

Votre code imprime '0.0000200001' pour moi. – lexicore

0
BigDecimal decimal = new BigDecimal(1.07522); 
BigDecimal decimal1 = new BigDecimal(1.0752); 
System.out.println(decimal.subtract(decimal1).setScale(5, RoundingMode.DOWN)); 
+0

Cela fonctionne mais j'ai besoin d'utiliser le ROUND_MULTIPLIER, je ne peux pas coder la valeur de mise à l'échelle comme 5. – ACz

+0

@ACz Vous pouvez enregistrer le "5" au lieu du 10000 dans une constante ou vous pouvez calculer le 5 en utilisant le logarithme. –

0

BigDecimal est la voie à suivre, mais pourquoi est le ROUND_MULTIPLIER une double valeur si vous jetterez aux int de toute façon. Peut-être que c'est là que vous obtenez vos problèmes d'arrondi? Donnez-lui un spin avec un int-multiplicateur :)

Editer: en utilisant setScale() régler un mode d'arrondi correct est généralement un meilleur choix, mais vous insistez sur l'utilisation du multiplicateur, non?

+0

Oui, j'ai besoin d'utiliser ce ROUND_MULTIPLIER et je le lance en Int parce que MethContext a besoin d'int. – ACz