如何在 Dart 中进行整除?

我有整数除法麻烦的 Dart,因为它给我的错误: ’异常中断: 类型‘ double’不是类型‘ int’的子类型‘ c’。’

下面是代码:

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’的除法将得到浮点数/双精度数值的结果,它也应该直接转换为整数值,而不是像那样抛出错误。

我有一个变通方法。()/.()/.Floor () ,但是这还不够,因为在我的程序中,这个小操作非常关键,因为它在一个游戏更新中被调用了数千次(或者可以在 requestAnimationFrame 中说)。

我还没有找到任何其他的解决办法,任何想法? 谢谢。

Dart 版本: 1.0.0 _ r30798

54290 次浏览

整数除法是

c = a ~/ b;

你也可以用

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

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

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

密码:

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类型。

简短回答

使用 c = a ~/ b

长答案

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

doubleint都是 num的亚型。

当使用 /运算符划分两个整数时,计算结果为 doublec变量被初始化为一个整数。你至少可以做两件事:

  1. 使用 c = a ~/ b

~/操作符返回一个 int

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

截断“组织”操作员

您可以使用 < strong > 截断除法运算符 ~/ 从除法运算得到一个整数结果:

4 ~/ 2; // 2 (int)

“组织”的接线员

常规分部操作员 /在运行时总是返回一个 double值(参见文档) :

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

运行时和编译时

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

原因如下:
当一个表达式可以是 在编译时计算时,它将在该阶段被简化,并且也被相应地类型化。编译器只需在编译时将 4 / 2转换为 2,这显然是一个 int。循环阻止编译器计算表达式。

只要你的除法运行在 在运行时(也就是在编译时无法预测的变量) ,/(double)和 ~/(int)操作符的返回类型就是你在运行时看到的表达式的类型。

请参阅 这个有趣的例子以获得进一步的参考。

结论

一般来说,常规除法运算符 /总是 返回一个 double截断除法可以用来得到一个 int结果。

然而,编译器最佳化可能会导致一些有趣的结果:)