40 votes

Pourquoi la division d'un nombre flottant par un nombre entier donne-t-elle 0,0 ?

Ainsi, si je dispose d'une plage de nombres "0 - 1024" et que je souhaite les faire entrer dans la plage "0 - 255", les mathématiques imposent de diviser l'entrée par le maximum de l'entrée (1024 dans ce cas), ce qui me donne un nombre compris entre 0,0 et 1,0, puis de multiplier ce nombre par la plage de destination (255).

C'est ce que je veux faire !

Mais pour une raison quelconque, en Java (en utilisant Processing), il renverra toujours une valeur de 0.

Le code serait aussi simple que ceci

float scale;
scale = (n/1024) * 255;

Mais je n'obtiens que 0.0. J'ai essayé double et int. en vain. POURQUOI ?

73voto

tim_yates Points 63521

C'est parce que vous faites une division entière.

Divisez par un double ou un flottant, et cela fonctionnera :

double scale = ( n / 1024.0 ) * 255 ;

Ou, si vous le souhaitez, comme un flotteur,

float scale = ( n / 1024.0f ) * 255 ;

19voto

Alexandre C. Points 31758

N / 1024 est division entière ce qui donne un entier (c'est-à-dire 0 dans ce cas).

Utilisation n / 1024.0 au lieu de cela.

7voto

John Kugelman Points 108754

Je présume que n est un int . Comme les constantes 1024 et 255 sont toutes deux int car tous les calculs du côté droit sont effectués avec des nombres entiers. Cela signifie que le résultat de n/1024 est tronquée à une valeur intégrale avant d'être multipliée par 255 .

Chacune de ces modifications permettra aux calculs de fonctionner correctement :

scale = n / 1024.0 * 255.0;       // Use double constants.
scale = (double) n / 1024 * 255;  // Convert n to a double.
scale = n * 255 / 1024;           // Multiply before dividing.

La dernière utilise toujours des nombres entiers, mais en changeant l'ordre des opérations, vous n'obtiendrez pas la troncature indésirable à 0. Cependant, vous n'obtiendrez toujours que des nombres entiers, ce qui signifie que vous perdrez les décimales dans les réponses.

2voto

Agos Points 3858

Vous devriez auto-caster n en flottant au moyen d'une multiplication FIRST, sinon vous effectuez une opération sur les entiers, puis vous cassez le résultat, au lieu d'effectuer l'opération entre les flottants.

float scale;
scale = n * 1.0 / 1024 * 255;

2voto

codaddict Points 154968

Dans votre cas n/1024 donne 0 car il s'agit d'une division entière. Pour y remédier, vous pouvez lancer n a float . Vous obtiendrez ainsi un résultat compris entre 0.0 y 1.0 Ensuite, vous multipliez par 255 et convertir le résultat en entier. Vous devez également déclarer scale comme int

int scale;
int n = 80; 
scale = (int)(((float)n/1024) * 255);

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