web-dev-qa-db-fra.com

BigDecimal, précision et échelle

J'utilise BigDecimal pour mes numéros dans mon application, par exemple avec JPA. J'ai fait quelques recherches sur les termes "précision" et "échelle" mais je ne comprends pas ce qu'ils sont exactement.

Quelqu'un peut-il m'expliquer le sens de "précision" et "échelle" pour une valeur BigDecimal?

@Column(precision = 11, scale = 2)

Merci!

52
jpadilladev

Un BigDecimal est défini par deux valeurs: un entier de précision arbitraire et un entier de 32 bits scale. La valeur de BigDecimal est définie comme étant unscaledValue*10^{-scale}.

Précision:

La précision est le nombre de chiffres dans la valeur non mise à l'échelle. Par exemple, pour le nombre 123,45, la précision renvoyée est 5.

Ainsi, precision indique la longueur du nombre entier de précision arbitraire. Voici quelques exemples de nombres avec la même échelle, mais avec une précision différente:

  • 12345/100000 = 0,12345 // échelle = 5, précision = 5
  • 12340/100000 = 0,1234 // échelle = 5, précision = 4
  • 1/100000 = 0.00001 // échelle = 5, précision = 1

Dans le cas particulier où le nombre est égal à zéro (c'est-à-dire 0,000), la précision est toujours de 1.

Échelle:

Si zéro ou positif, le scale est le nombre de chiffres à la droite du point décimal. Si elle est négative, la valeur non échelonnée du nombre est multipliée par dix à la puissance de la négation de l'échelle. Par exemple, une échelle de -3 signifie que la valeur non mise à l'échelle est multipliée par 1000.

Cela signifie que la valeur entière du "BigDecimal" est multipliée par 10^{-scale}.

Voici quelques exemples de la même précision, à différentes échelles:

  • 12345 avec l'échelle 5 = 0.12345
  • 12345 avec l'échelle 4 = 1,2345
  • 12345 avec l'échelle 0 = 12345
  • 12345 à l'échelle -1 = 123450

BigDecimal.toString:

La méthode toString d'un BigDecimal se comporte différemment en fonction de l'échelle et de precision. (Merci à @RudyVelthuis pour l'avoir signalé.)

  • Si scale == 0, l’entier vient d’être imprimé tel quel.
  • Si scale < 0, La notation électronique est toujours utilisée (par exemple, l’échelle 5 produit "5E + 1")
  • Si scale >= 0 et precision - scale -1 >= -6 un nombre décimal simple est produit (par exemple, 10000000 échelle 1 produit "1000000.0")
  • Sinon, la notation E est utilisée, par exemple 10 échelle 8 produit "1.0E-7" depuis precision - scale -1 équivaut à unscaledValue*10^{-scale} est inférieur à -6.

Autres exemples:

  • 19/100 = 0,19 // nombre entier = 19, échelle = 2, précision = 2
  • 1/1000 = 0,0001 // nombre entier = 1, échelle = 4, précision = 1
75
Austin D
  • Précision: Nombre total de chiffres significatifs

  • Échelle: Nombre de chiffres à la droite du point décimal

Voir BigDecimal documentation de la classe pour plus de détails.

46
hamena314

Citant Javadoc :

La précision est le nombre de chiffres dans la valeur non mise à l'échelle.

et

Si zéro ou positif, l'échelle correspond au nombre de chiffres à droite du point décimal. Si elle est négative, la valeur non échelonnée du nombre est multipliée par dix à la puissance de la négation de l'échelle. Par exemple, une échelle de -3 signifie que la valeur non mise à l'échelle est multipliée par 1000.

4
Andy Turner

D'après votre exemple d'annotation, le nombre maximal de chiffres est 2 après le point décimal et 9 avant (au total 11): 123456789,01

1
adranale