Dart中的整数分裂

23 dart

我在Dart中遇到整数除法有问题,因为它给了我错误:'打破异常:类型'double'不是'c'类型'int'的子类型.

这是以下代码:

int a = 500;
int b = 250;
int c;

c = a / b; // <-- Gives warning in Dart Editor, and throws an error in runtime.
Run Code Online (Sandbox Code Playgroud)

如你所见,我期待结果应为2,或者说,即使'a'或'b'的除法有浮点/双值的结果,它也应该直接转换为整数值,而不是抛出这样的错误.

我有一个使用.round()/.ceil()/.floor()的解决方法,但这不足以像我的程序一样,这个小操作很关键,因为它在一次游戏更新中被调用了数千次(或者你可以在requestAnimationFrame中说.

我还没有找到任何其他解决方案,任何想法?谢谢.

飞镖版:1.0.0_r30798

gth*_*der 27

这是因为DART使用double来表示所有的数字dart2js.如果你玩这个,你可以获得有趣的结果:

码:

int a = 1; 
a is int; 
a is double;
Run Code Online (Sandbox Code Playgroud)

结果:

true
true
Run Code Online (Sandbox Code Playgroud)

实际上,建议在num数字时使用类型,除非你有充分的理由去做int(例如for循环).如果你想继续使用int,请使用截断分区,如下所示:

int a = 500;
int b = 250;
int c;

c = a ~/ b;
Run Code Online (Sandbox Code Playgroud)

否则,我会建议使用num类型.

  • Dart使用双精度来表示仅在dart2js中的数字.VM正确区分这两种类型.请更新你的答案. (6认同)

Gün*_*uer 25

整数除法是

c = a ~/ b;
Run Code Online (Sandbox Code Playgroud)

你也可以用

c = (a / b).floor();
c = (a / b).ceil();
Run Code Online (Sandbox Code Playgroud)

如果你想定义如何处理分数.


Iya*_*jao 11

简答

使用c = a ~/ b.

长答案

根据文档,int没有小数点的数字,而double有小数点的数字。

这两个doubleint的亚型num

当使用/运算符将两个整数相除时,结果被计算为 a double。并且c变量被初始化为一个整数。您至少可以做两件事:

  1. 使用c = a ~/ b.

~/操作返回int

  1. 使用var c;. 这创建了可以被分配给任何类型的动态变量,包括一个doubleintString


cre*_*not 6

截断除法运算符

您可以使用截断除法运算符~/除法运算中获得整数结果:

4 ~/ 2; // 2 (int)
Run Code Online (Sandbox Code Playgroud)

除法运算符

常规除法运算符/将始终返回double在运行时(见文档)值:

for (var i = 4; i == 4; i = 3) {
  i / 2; // 2 (double)
}
Run Code Online (Sandbox Code Playgroud)

运行时与编译时

您可能已经注意到,我为第二个示例(对于常规除法运算符)而不是4 / 2.

这样做的原因如下:
当一个表达式可以在编译时计算时,它会在那个阶段被简化并相应地输入。编译器会在编译时简单地转换4 / 22,这显然是一个int. 循环阻止编译器评估表达式。

只要您的除法发生在运行时(即在编译时无法预测的变量),/( double) 和~/( int) 运算符的返回类型将是您在运行时将看到的表达式类型。

请参阅此有趣的示例以获取进一步参考。

结论

一般而言,常规除法运算符/始终返回一个double值,而可以使用截断除法int代替得到结果。

然而,编译器优化可能会导致一些奇怪的结果:)