我在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
答案 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
value 和 truncate divide 可用于获得 /
结果。
然而,编译器优化可能会导致一些奇怪的结果:)
答案 3 :(得分:4)
简短回答
使用c = a ~/ b
。
长期回答
根据文档,int
是不带小数点的数字,而double
是不带小数点的数字。
double
和int
都是num
的子类型。
使用/
运算符将两个整数相除时,结果将评估为double
。并且c
变量被初始化为整数。您至少可以做两件事:
c = a ~/ b
。 ~/
运算符返回int
。
var c;
。这将创建一个动态变量,可以将其分配给任何类型,包括double
和int
和String
等。