[英]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
是有小數點的數字。
double
和int
都是num
子類型。
當兩個整數使用/
運算符相除時,結果被計算為double
。 並且c
變量被初始化為一個整數。 您至少可以做兩件事:
c = a ~/ b
。 ~/
運算符返回一個int
。
var c;
. 這將創建一個可以分配給任何類型的動態變量,包括double
和int
以及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.