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类型.
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有小数点的数字。
这两个double和int的亚型num。
当使用/运算符将两个整数相除时,结果被计算为 a double。并且c变量被初始化为一个整数。您至少可以做两件事:
c = a ~/ b.该~/操作返回int。
var c;. 这创建了可以被分配给任何类型的动态变量,包括一个double和int与String等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 / 2为2,这显然是一个int. 循环阻止编译器评估表达式。
只要您的除法发生在运行时(即在编译时无法预测的变量),/( double) 和~/( int) 运算符的返回类型将是您在运行时将看到的表达式类型。
请参阅此有趣的示例以获取进一步参考。
一般而言,常规除法运算符/始终返回一个double值,而可以使用截断除法来int代替得到结果。
然而,编译器优化可能会导致一些奇怪的结果:)