Dlaczego otrzymuję inny wynik z tym samym kodem?
Napisałem jakiś kod do darta zgodnie z kodem js i jest problem, mam nadzieję, że ktoś może mi pomóc /
kod js:
var max = 0x80000000;
var data = -2000;
var mod = data % max;
wartość mod to -2000
Kod do darta:
var max = 0x80000000;
var data = -2000;
var mod = data % max;
wartość mod to 2147481648
Czemu?
Odpowiedzi
Ponieważ JavaScript i Dart to różne języki z różnymi specyfikacjami operatora.
Dart określa, że wynik pozostałej części operacji jest zawsze dodatni:
https://api.dart.dev/stable/2.10.4/dart-core/num/operator_modulo.html
W JavaScript reszta może być ujemna, znak wyniku jest równy znakowi dywidendy:
https://www.ecma-international.org/ecma-262/11.0/index.html#sec-numeric-types-number-remainder
Dart ma dwa operatory „modulo” na liczbach całkowitych %
(aka. Modulo) i remainder
.
Różnią się one dla argumentów ujemnych tym, czy wynik przyjmuje znak dywidendy, czy dzielnik. W przypadku operandów dodatnich oba są zgodne.
Porównać:
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)}");
}
}
}
Ten kod pokazuje wszystkie kombinacje i a == (a ~/ b) * b + a.remainder(b)
ogólnie.