簡體   English   中英

如何在 Dart 中進行整數除法?

[英]How to do Integer division in 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

那是因為Dart 使用double來表示dart2js所有數字 如果你玩這個,你可以獲得有趣的結果:

代碼:

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

結果:

true
true

實際上,建議在處理num時使用num類型,除非您有充分的理由將其設為int (例如在 for 循環中)。 如果您想繼續使用int ,請使用如下截斷除法:

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

c = a ~/ b;

否則,我會建議使用num類型。

整數除法是

c = a ~/ b;

你也可以使用

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

如果你想定義分數應該如何處理。

簡答

使用c = a ~/ b

長答案

根據文檔, int是沒有小數點的數字,而double是有小數點的數字。

doubleint都是num子類型。

當兩個整數使用/運算符相除時,結果被計算為double 並且c變量被初始化為一個整數。 您至少可以做兩件事:

  1. 使用c = a ~/ b

~/運算符返回一個int

  1. 使用var c; . 這將創建一個可以分配給任何類型的動態變量,包括doubleint以及String等。

截斷除法運算符

您可以使用截斷除法運算符~/從除法運算中獲取整數結果:

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結果。

然而,編譯器優化可能會導致一些奇怪的結果:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM