Question Division entière avec reste en JavaScript?


En JavaScript, comment puis-je obtenir:

  1. le nombre entier de fois qu'un entier donné va dans un autre?
  2. le reste?

691
2017-11-19 18:53


origine


Réponses:


Pour un certain nombre y et un diviseur x calculer le quotient (quotient) et reste (remainder) comme:

var quotient = Math.floor(y/x);
var remainder = y % x;

921
2017-11-19 18:55



Je ne suis pas expert dans les opérateurs bit à bit, mais voici une autre façon d'obtenir le nombre entier:

var num = ~~(a / b);

Cela fonctionnera correctement pour les nombres négatifs, tandis que Math.floor() va tourner dans la mauvaise direction.

Cela semble correct aussi:

var num = (a / b) >> 0;

310
2017-11-19 19:14



J'ai fait des tests de vitesse sur Firefox.

-100/3             // -33.33..., 0.3663 millisec
Math.floor(-100/3) // -34,       0.5016 millisec
~~(-100/3)         // -33,       0.3619 millisec
(-100/3>>0)        // -33,       0.3632 millisec
(-100/3|0)         // -33,       0.3856 millisec
(-100-(-100%3))/3  // -33,       0.3591 millisec

/* a=-100, b=3 */
a/b                // -33.33..., 0.4863 millisec
Math.floor(a/b)    // -34,       0.6019 millisec
~~(a/b)            // -33,       0.5148 millisec
(a/b>>0)           // -33,       0.5048 millisec
(a/b|0)            // -33,       0.5078 millisec
(a-(a%b))/b        // -33,       0.6649 millisec

Ce qui précède est basé sur 10 millions d'essais pour chacun.

Conclusion: Utilisation (a/b>>0) (ou (~~(a/b)) ou (a/b|0)) pour atteindre environ 20% de gain en efficacité. Gardez également à l'esprit qu'ils sont tous incompatibles avec Math.floor, quand a/b<0 && a%b!=0.


149
2018-06-20 15:42



ES6 présente le nouveau Math.trunc méthode. Cela permet de réparer @ La réponse de MarkElliot pour le faire fonctionner pour les nombres négatifs aussi:

var div = Math.trunc(y/x);
var rem = y % x;

Notez que Math les méthodes ont l'avantage sur les opérateurs bit à bit qu'ils travaillent avec des nombres supérieurs à 231.


92
2018-03-10 17:30



var remainder = x % y;
return (x - remainder) / y;

21
2018-02-14 06:48



Vous pouvez utiliser la fonction parseInt pour obtenir un résultat tronqué.

parseInt(a/b)

Pour obtenir un reste, utilisez l'opérateur mod:

a%b

parseInt a quelques pièges avec des chaînes, pour éviter l'utilisation du paramètre radix avec la base 10

parseInt("09", 10)

Dans certains cas, la représentation sous forme de chaîne du nombre peut être une notation scientifique, dans ce cas, parseInt produira un mauvais résultat.

parseInt(100000000000000000000000000000000, 10) // 1e+32

Cet appel produira 1 comme résultat.


11
2018-04-13 17:17



JavaScript calcule le plancher des nombres négatifs et le reste des nombres non entiers, en suivant les définitions mathématiques pour eux.

FLOOR est défini comme "le plus grand nombre entier plus petit que le paramètre", ainsi:

  • nombres positifs: FLOOR (X) = partie entière de X;
  • nombres négatifs: FLOOR (X) = partie entière de X moins 1 (car il doit être plus petit que le paramètre, c'est-à-dire plus négatif!)

REMAINDER est défini comme le "reste" d'une division (arithmétique euclidienne). Lorsque le dividende n'est pas un entier, le quotient n'est généralement pas un entier, c'est-à-dire qu'il n'y a pas de reste, mais si le quotient est forcé à être un entier (et c'est ce qui arrive quand quelqu'un essaie d'obtenir le reste ou le module nombre à virgule flottante), il y aura évidemment un "non-entier".

JavaScript calcule tout comme prévu, donc le programmeur doit faire attention à poser les bonnes questions (et les gens doivent faire attention à ce qui est demandé!) La première question de Yarin n'était PAS "quelle est la division entière de X par Y", mais, au lieu de cela, "le nombre total de fois qu'un entier donné entre dans un autre". Pour les nombres positifs, la réponse est la même pour les deux, mais pas pour les nombres négatifs, car la division entière (dividende par diviseur) sera -1 plus petite que les fois qu'un nombre (diviseur) "entre" dans un autre (dividende). En d'autres termes, FLOOR retournera la bonne réponse pour une division entière d'un nombre négatif, mais Yarin ne l'a pas demandé!

gammax répondu correctement, ce code fonctionne comme demandé par Yarin. D'un autre côté, Samuel a tort, il n'a pas fait les calculs, je suppose, ou il aurait vu que ça marche (aussi, il n'a pas dit quel était le diviseur de son exemple, mais j'espère que c'était 3):

Reste = X% Y = -100% 3 = -1

GoesInto = (X - Reste) / Y = (-100 - -1) / 3 = -99 / 3 = -33

En passant, j'ai testé le code sur Firefox 27.0.1, il a fonctionné comme prévu, avec des nombres positifs et négatifs et aussi avec des valeurs non entières, à la fois pour le dividende et le diviseur. Exemple:

-100.34 / 3.57: GoesInto = -28, Reste = -0.3800000000000079

Oui, j'ai remarqué, il y a un problème de précision, mais je n'ai pas eu le temps de le vérifier (je ne sais pas si c'est un problème avec Firefox, Windows 7 ou avec le FPU de mon CPU). Pour la question de Yarin, qui ne concerne que les entiers, le code de gammax fonctionne parfaitement.


5
2018-02-27 19:23



Math.floor(operation) renvoie la valeur arrondie de l'opération.

Exemple de 1st question:

var x = 5;
var y = 10.4;
var z = Math.floor(x + y);

console.log(z);

Console:

15

Exemple de 2sd question:

var x = 14;
var y = 5;
var z = Math.floor(x%y);

console.log(x);

Console:

4


5
2017-11-01 00:22