web-dev-qa-db-fra.com

Pourquoi le code de division entière donne-t-il la mauvaise réponse?

J'ai une division très simple en Java (c'est une quantité de produit/production par heure), cependant chaque fois que je fais cette division, je reçois des erreurs étranges:

float res = quantity / standard;

J'ai essayé la division ci-dessus avec plusieurs valeurs et je reçois toujours des erreurs, mais celle que j'ai essayée partout et qui s'est bien déroulée était la suivante:

Partout dans le monde:

13.6 = 6800 / 500;

Java:

13.0 = 6800 / 500;

J'ai recherché BigDecimal et BigInteger, mais je n'ai pas trouvé le moyen de créer cette division avec eux. Existe-t-il un autre moyen de réaliser cette division en Java sans erreurs de précision?

Toute aide est la bienvenue.

25
Julian C.

Vous divisez des nombres entiers, ce qui signifie que vous utilisez division de nombre entier .

En division entière, la partie décimale du résultat est supprimée.

Essayez ce qui suit:

float res = (float) quantity / standard;
            ^^^^^^^

Ce qui précède oblige le numérateur à être traité comme une variable float, ce qui favorise également le flottement du dénominateur, et une division flottante est effectuée au lieu d'une division int.

Notez que si vous avez affaire à des littéraux, vous pouvez changer

float f = 6800 / 500;

inclure le suffixe f pour transformer le flottant en dénominateur:

float f = 6800f / 500;
              ^
71
aioobe

Si vous êtes préoccupé par la précision, je suggérerais d'utiliser double, qui a plus du double du nombre de chiffres de précision. Cependant, la virgule flottante ne représente avec précision que les fractions qui sont une somme ou des puissances de 0,5. Cela signifie que 0,6 n’est représenté qu’à peu près. Cela ne doit pas être un problème d'arrondi approprié.

double d = (double) 6800 / 500;

ou

double d = 6800.0 / 500;
3
Peter Lawrey

Dans mon cas, je faisais ceci:

double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1));

Au lieu du "correct":

double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);
1
Felipe Volpato

salut essayer celui-ci, il peut aider à répondre à vos besoins

double percent=(7819140000l-3805200000l)*100f/7819140000l;

public String format_Decimal(double decimalNumber) {
		NumberFormat nf = NumberFormat.getInstance();
		nf.setMaximumFractionDigits(5);
		nf.setMinimumFractionDigits(2);
		nf.setRoundingMode(RoundingMode.HALF_UP);
		String x = nf.format(decimalNumber);
		return x;
	}

0
Chandu D