【问题标题】:How to do Integer division in Dart?如何在 Dart 中进行整数除法?
【发布时间】:2014-01-10 02:29:56
【问题描述】:

我在 Dart 中遇到整数除法问题,因为它给了我错误:'Breaking on exception: type 'double' is not a subtype of type 'int' of 'c'。 p>

下面是代码:

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

【问题讨论】:

    标签: dart


    【解决方案1】:

    这是因为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 类型。

    【讨论】:

    • Dart 仅在 dart2js 中使用双精度数来表示数字。 VM 正确区分了这两种类型。请更新您的答案。
    • 只是一个小更新:即使是 Dart VM 也会对整数除法进行加倍,即使它不会产生分数。 ~/ 帮助了,谢谢!
    【解决方案2】:

    整数除法

    c = a ~/ b;
    

    你也可以使用

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

    如果您想定义应如何处理分数。

    【讨论】:

      【解决方案3】:

      简答

      使用c = a ~/ b

      长答案

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

      doubleint 都是 num 的子类型。

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

      1. 使用c = a ~/ b

      ~/ 运算符返回 int

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

      【讨论】:

        【解决方案4】:

        截断除法运算符

        您可以使用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) 和 ~/ (@ 987654338@) 运算符将是您在运行时看到的表达式类型。

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

        结论

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

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

        【讨论】:

          猜你喜欢
          • 2010-10-07
          • 2018-11-14
          • 2019-08-02
          • 1970-01-01
          • 2017-10-22
          • 1970-01-01
          • 2020-02-27
          • 2014-01-14
          • 1970-01-01
          相关资源
          最近更新 更多