【问题标题】:Why I get different result with same code?为什么我用相同的代码得到不同的结果?
【发布时间】:2020-11-19 11:50:36
【问题描述】:

我在js代码后面写了一些dart代码,有问题,希望有人能帮助我/

js代码:

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

mod值为-2000

飞镖代码:

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

mod 值为 2147481648

为什么?

【问题讨论】:

标签: javascript dart


【解决方案1】:

因为 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

【讨论】:

    【解决方案2】:

    Dart 在整数上有two "modulo" operators,%(又名模数)和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)。

    【讨论】:

    • 所以我们可以说 Dart 更严格
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 2016-08-16
    相关资源
    最近更新 更多