동일한 코드로 다른 결과를 얻는 이유는 무엇입니까?

Nov 19 2020

js 코드를 따르는 다트 코드를 작성했는데 문제가 있습니다. 누군가가 나를 도울 수 있기를 바랍니다.

js 코드 :

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

모드 값은 -2000입니다.

다트 코드 :

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

모드 값은 2147481648입니다.

왜?

답변

5 Patrick Nov 19 2020 at 12:32

JavaScript와 Dart는 연산자 사양이 다른 언어이기 때문입니다.

Dart는 나머지 연산 결과가 항상 양수임을 지정합니다.

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

JavaScript에서 나머지는 음수 일 수 있으며 결과의 부호는 배당금의 부호와 같습니다.

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에는 정수에 대해 두 개의 "모듈로"연산자% (일명 모듈로) 및 remainder.

결과가 피제수 또는 제수의 부호를 취하는 지 여부가 음수 피연산자의 경우 다릅니다. 양수 피연산자의 경우 두 가지가 동의합니다.

비교:

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)}");
    }
  }
}

이 코드는 모든 조합과 a == (a ~/ b) * b + a.remainder(b)일반적인 조합을 보여줍니다 .