동일한 코드로 다른 결과를 얻는 이유는 무엇입니까?
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)
일반적인 조합을 보여줍니다 .