2010-04-16 12 views
1

J'ai une situation où j'ai besoin de savoir combien de fois un int va dans un nombre décimal, mais dans certains cas, je perds de la précision. Voici la méthode:Java - Comment éviter la perte de précision lors de la division et de la conversion en int?

public int test(double decimalAmount, int divisor) { 
    return (int) (decimalAmount/ (1d/divisor)); 
} 

Le problème est si je passe en 1.2 comme la quantité décimale et 5 comme le diviseur, je reçois 5 au lieu de 6. Comment puis-je restrusture ce donc je sais combien de fois 5 entre dans la quantité décimale en tant qu'int?

+2

Je pense que vous devez donner une version plus généralisée de la question - les termes que vous utilisez de sens que pour les entiers, soit 5 divise en 1,2 = 0/Si vous améliorer la définition Je suppose que vous obtiendrez la réponse car je suspecte que le problème est dû à l'arrondissement – Mark

+1

Cela n'a rien à voir avec l'arrondi et tout ce qui concerne la formule. Une décimale divisée par un int est simple (int) (decimalAmount/divisor). Je pense que c'est ce que David recherche. À l'heure actuelle, ce code fait une multiplication de decimalAmount et divisor. –

Répondre

3
public int test(double decimalAmount, int divisor) { 
    return (int) (divisor * decimalAmount); 
} 

De toute évidence, il s'agit simplement de multiplier puis de tronquer. Pourquoi pensez-vous avoir besoin de cette méthode?

3

Le résultat du calcul est probablement quelque chose comme 5.999999999994, car le résultat à virgule flottante n'est pas nécessairement exactement un nombre entier. Lorsque vous lancez un int, vous tronquez, et le résultat est 5. Pour un autre ensemble similaire d'arguments, vous pourriez voir un résultat de 6.0000000000002, et il vous donnerait 6.

Mais le fait que ce soit si sensible à la représentation à virgule flottante remet en question pourquoi vous pensez que vous voulez cela - peut-être qu'il y a une meilleure façon de faire ce que vous voulez faire. Par exemple, la réponse ci-dessus est correcte, cela simplifie, et c'est encore moins clair.

Pour vraiment faire ce que je pense que vous imaginez que vous voulez faire, vous ne devez pas utiliser double s ou float s. Vous avez besoin de java.util.BigDecimal - regardez comment cela fonctionne. Vous pouvez l'utiliser pour "exactement" multiplier 5 et 1.2 pour obtenir 6.

1

Les opérations de virgule flottante ne sont pas correctes, ce sont des approximations. Par cette opération, vous pourriez obtenir par exemple 5.9 comme résultat. Casting à int résultat en 5 (au lieu de 6). Essayez arrondi au lieu de tronquer:

public int test(double decimalAmount, int divisor) { 
    return Math.round(divisor * decimalAmount); 
} 
Questions connexes