Division des entiers en Java [dupliquer]

cette question a déjà une réponse ici:

  • pourquoi le résultat de 1/3 = = 0? 13 Réponses

C'est une question de base mais je ne trouve pas de réponse. J'ai regardé dans l'arithmétique flottante et quelques autres sujets, mais rien n'a semblé aborder cela. Je suis sûr que je viens de la bonne terminologie.

fondamentalement, je veux prendre deux quantités-complétées, et total - et les diviser pour venir avec un pourcentage (de combien a été accompli). Les quantités sont long s. Voici la configuration:

long completed = 25000;
long total = 50000;

System.out.println(completed/total);  // Prints 0

j'ai essayé de réassigner le résultat à un double - it imprime 0.0 . Où vais-je tort?

soit dit en passant, l'étape suivante est de multiplier ce résultat par 100, ce que je supposons que ce soit facile une fois ce petit obstacle franchi.

BTW pas de devoirs ici juste un vieux numskull-ness (et peut-être trop de codage aujourd'hui).

75
demandé sur Ben 2011-08-28 15:34:14

7 réponses

conversion de la sortie est trop tard; le calcul a déjà eu lieu en arithmétique entière. Vous devez convertir les inputs en double :

System.out.println((double)completed/(double)total);

notez que vous n'avez pas réellement besoin de convertir les deux d'entre eux; tant que l'un est double , l'autre sera converti implicitement. Mais je préfère faire les deux, pour la symétrie.

112
répondu Oliver Charlesworth 2011-08-28 11:35:27

tu n'as même pas besoin de doubles pour ça. Il suffit de multiplier par 100 d'abord , puis de diviser. Sinon le résultat serait inférieur à 1 et obtenir tronqué à zéro, comme vous l'avez vu.

éditer: ou si le débordement est probable, s'il serait débordement (c'est-à-dire le dividende est plus grand que 922337203685477581), diviser le diviseur par 100 d'abord.

8
répondu harold 2016-03-11 11:21:06

convertissez à la fois completed et total en double ou au moins jetez-les en double lors de la devision. C'est-à-dire: cast les variables pour doubler non seulement le résultat.

bon avertissement, il y a un floating point precision problem quand on travaille avec float et double .

3
répondu Ali 2017-05-23 11:47:19

Si vous n'avez pas explicitement exprimés l'un des deux valeurs à un flotteur avant de faire la division de division entière (c'est pourquoi vous obtenez 0). Vous avez juste besoin que l'un des deux opérandes soit une valeur flottante, de sorte que la division normale soit utilisée (et que l'autre valeur entière soit automatiquement transformée en un flottant).

essayez

float completed = 50000.0f;

et ça ira.

1
répondu Jack 2011-08-28 11:36:38
In Java
Integer/Integer = Integer
Integer/Double = Double//Either of numerator or denominator must be floating point number
1/10 = 0
1.0/10 = 0.1
1/10.0 = 0.1

tapez juste moulé l'un ou l'autre.

0
répondu Bhavya Jain 2016-07-14 18:02:48

comme l'explique le JLS , l'opération entière est très simple.

si un opérateur entier autre qu'un opérateur de poste a au moins un opérande de type long, alors l'opération est effectuée avec une précision de 64 bits, et le résultat de l'opérateur numérique est de type long. Si l'autre opérande n'est pas long, il est d'abord élargi (§5.1.5) à taper long par promotion numérique (§5.6).

Dans le cas contraire, l'opération est effectuée avec une précision de 32 bits, et le résultat de l'opérateur numérique est de type int. Si l'un ou l'autre opérande n'est pas un int, il est d'abord élargi à taper int par promotion numérique.

Donc, pour faire court, une opération toujours un int à la seule exception qu'il y a un long valeur en elle.

int = int + int
long = int + long
int = short + short

notez que la priorité de l'opérateur est importante, donc si vous ont

long = int * int + long

l'opération int * int se traduirait par un int , elle serait promue en long pendant l'opération int + long

0
répondu AxelH 2017-05-09 08:46:59

comme vos résultats de sortie un double, vous devriez lancer soit la variable terminée ou la variable totale ou les deux à doubler tout en divisant.

ainsi, l'implementation correcte sera:

System.out.println((double)completed/total);
-3
répondu sarat 2017-08-20 04:44:41