Pourquoi j'obtiens un résultat différent avec le même code?

Nov 19 2020

J'ai écrit du code de fléchettes suivre le code js et il y a un problème, j'espère que quelqu'un pourra m'aider /

code js:

var max = 0x80000000;
var data = -2000;
var mod = data % max;

la valeur du mod est -2000

Code de fléchette:

var max = 0x80000000;
var data = -2000;
var mod = data % max;

la valeur du mod est 2147481648

Pourquoi?

Réponses

5 Patrick Nov 19 2020 at 12:32

Parce que JavaScript et Dart sont des langages différents avec des spécifications d'opérateurs différentes.

Dart spécifie que le résultat de l'opération de reste est toujours positif:

https://api.dart.dev/stable/2.10.4/dart-core/num/operator_modulo.html

En JavaScript le reste peut être négatif, le signe du résultat est égal au signe du dividende:

https://www.ecma-international.org/ecma-262/11.0/index.html#sec-numeric-types-number-remainder

3 lrn Nov 19 2020 at 16:01

Dart a deux opérateurs "modulo" sur les entiers, %(aka. Modulo) et remainder.

Ils diffèrent pour les opérandes négatifs selon que le résultat prend le signe du dividende ou du diviseur. Pour les opérandes positifs, les deux sont d'accord.

Comparer:

void main() {
  for (var a in [5, -5]) {
    for (var b in [3, -3]) {
      print("$a ~/ $b         = ${a ~/ b}"); print("$a % $b = ${a % b}");
      print("$a.remainder($b) = ${a.remainder(b)}"); print("$a = $b * ($a ~/ $b) + $a.remainder($b) = ${b * (a ~/ b) + a.remainder(b)}");
    }
  }
}

Ce code montre toutes les combinaisons et cela a == (a ~/ b) * b + a.remainder(b)en général.