Dart中的整数分裂

时间:2013-12-21 08:12:31

标签: 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.

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

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

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

飞镖版:1.0.0_r30798

4 个答案:

答案 0 :(得分:17)

这是因为 Dart使用double代表dart2js中的所有数字。如果你玩这个,你可以获得有趣的结果:

代码:

int a = 1; 
a is int; 
a is double;

结果:

true
true

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

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

c = a ~/ b;

否则,我建议使用num类型。

答案 1 :(得分:15)

整数除法是

c = a ~/ b;

您也可以使用

c = (a / b).floor();
c = (a / b).ceil();

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

答案 2 :(得分:5)

截断除法运算符

您可以使用 truncating division operator ~/ 从除法运算中获得整数结果:

4 ~/ 2; // 2 (int)

除法运算符

regular division operator / 将始终在运行时返回 double 值(请参阅文档):

for (var i = 4; i == 4; i = 3) {
  i / 2; // 2 (double)
}

运行时间与编译时间

您可能已经注意到,我为第二个示例(用于常规除法运算符)而不是 4 / 2 编写了一个循环。

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

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

请参阅 this fun example 以获取更多参考。

结论

一般来说,常规除法运算符 int 总是 returns a double valuetruncate divide 可用于获得 / 结果。

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

答案 3 :(得分:4)

简短回答

使用c = a ~/ b

长期回答

根据文档,int是不带小数点的数字,而double是不带小数点的数字。

doubleint都是num的子类型。

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

  1. 使用c = a ~/ b

~/运算符返回int

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