2 votes

Multiplier un nombre par une fraction

J'écrivais quelques convertisseurs d'unités en utilisant BigDecimals et je suis tombé sur une situation où je devais multiplier un nombre avec une fraction - nombre périodique.

Dans la plupart des cas, la précision est suffisante, mais disons que nous avons une équation du type :

BigDecimal.valueOf(90)
          .multiply(BigDecimal.valueOf(10)
                              .divide(BigDecimal.valueOf(90), 6, RoundingMode.HALF_UP))

Normalement, cela devrait être égal à 10, mais à cause de l'arrondi, nous obtiendrons 9.999999...

Existe-t-il une manière élégante d'implémenter ceci sans avoir une condition if détectant quand la fraction peut être coupée ?

3voto

Andronicus Points 9662

Les éléments suivants fonctionneront :

BigDecimal.valueOf(90)
    .multiply(BigDecimal.valueOf(10))
    .divide(BigDecimal.valueOf(90), 6, RoundingMode.HALF_UP)

La différence est qu'ici les opérations sont enchaînées, ce qui permet de résoudre de tels cas. Dans votre solution, il faut calculer la division (où l'erreur se produit) et ensuite la multiplication, car elle est passée en argument.

1voto

Not a JD Points 1595

Je ne sais pas si cette réponse sera un cas général pour vous, mais elle fonctionne dans l'exemple donné :

bd = BigDecimal.valueOf(90)
               .multiply(BigDecimal.valueOf(10))
               .divide(BigDecimal.valueOf(90));

Multiplier par 10 puis diviser par 90.

a * x = ax
    -   --
    z    z

Vous devrez inclure une logique d'arrondi pour les nombres rationnels :

bd = BigDecimal.valueOf(1)
               .multiply(BigDecimal.valueOf(1))
               .divide(BigDecimal.valueOf(3));

Échouera sans arrondir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X