7
votes

Échelle () de la méthode de division dans BigDecimal

new BigDecimal("37146555.53880000").divide(new BigDecimal("1000000")).scale()
This returns 10. But according to the API, the divide method:
  Returns a BigDecimal whose value is
  (this / divisor), and whose preferred
  scale is (this.scale() -
  divisor.scale());
So in this case, 37146555.53880000's scale is 8, and 1000000's scale is 0. So the result should have a scale of 8, not 10.What am I missing here?Thanks

1 commentaires

Si cette valeur.Scale () est inférieure à la diviseur.scale () alors?


3 Réponses :


0
votes

Il dit "L'échelle préférée" non "sera définitivement une échelle".

Être absolument sûr, j'utiliserais bigdecimal.divide (bigdecimal, int, int) .


0 commentaires

1
votes

Ces échelles sont celles utilisées par le méthodes qui renvoient une arithmétique exacte résultats; sauf qu'un division exact peut avoir à utiliser une plus grande échelle depuis Le résultat exact peut avoir plus de chiffres. Par exemple, 1/32 est 0,03125.


0 commentaires

6
votes

Le résultat réel est 37.1465555388 dont l'échelle doit être 10 pour qu'elle soit exacte.

Qu'est-ce que le Javadoc dit est que l'échelle préférée est la différence qui signifie que si le résultat n'avait pas besoin d'être 10, il essaierait de le faire 8. Par exemple, si vous auriez divisé par 2, dont l'échelle est également 0, le résultat aurait été 18573277.76940000 (échelle 8).

EDIT: Petite récitation - Vous pouvez forcer la division à une certaine échelle en utilisant les méthodes de fracture surchargées:

  • Divide (BigDecimal, RoundingMode) qui donnera un BigDecimal avec l'échelle de Ceci et la valeur arrondie à l'aide de la méthode d'arrondi spécifiée Si le résultat aurait réellement besoin de plus de décimales pour être exact.

  • diviser (bigdecimal, échelle, rondingmode) qui donnera un bigdecimal avec une échelle spécifiée et une valeur arrondie par méthode spécifiée si nécessaire.

    Ceci pourrait être utile si votre division par un numéro que vous connaissez peut causer des décimales répétées, comme 3 (1/3 = 0,3333333 ...) car, si cela se passe, la division simple lancera une exception. La liaison à un nombre maximal de décimales vous aidera à éviter l'exception mais rendra vos calculs moins précis.


1 commentaires

Existe-t-il une formule pour déterminer comment l'échelle de résultat sera?