2017-05-03 41 views
2

我一直在尋找進入Screen類(包org.scalajs.dom.raw),發現以下屬性:爲什麼Double在Scala.js中用於不需要「雙倍」的屬性?

def width: Double = js.native 

def availHeight: Double = js.native 

def height: Double = js.native 

沒有任何理由使用Double代替Int?我不熟悉Scala.js代碼,但對我來說,使用Int會更有意義。

我在這裏錯過了什麼?

+1

'Int'不能縮放。我說過了。大多數屏幕圖形系統必須能夠處理子像素尋址。通常,我們在應用程序之外看不到這些東西,但爲了消除鋸齒效應,您需要能夠根據實數(非整數)座標計算抗鋸齒像素值。 –

+1

請注意,ECMAScript唯一的數字類型是'Number',它是一個IEEE754-2008 binary64雙精度二進制浮點數,它與* Scala.Double類型完全相同。 –

回答

6

有時,看起來總是整數的東西實際上可能取非整數值,就像@Bob Dalgleish解釋的那樣。

也有些情況下使用Double,因爲值可能大於2^31。雖然是整數值,但它們超出了Int的範圍,並且必須鍵入爲DoubleLong是不透明的,因此不是JS數字的有效表示)。

但是,有很多次Scala.js外觀類型(特別是DOM)使用Double僅僅是因爲它們是從TypeScript類型定義轉換而來的,只有number s。 Double是保守的近似值。在這些情況下,在驗證原始規範(通常在Web IDL中)後,我們可以將其縮小到Int(PR歡迎聲明,並附有Web IDL規範的鏈接)。

你提到的Screen屬性的具體情況屬於最後一類。從the original IDL可以看出,這些值被描述爲「long」。在IDL中,a long is an integer in the range [-2^31, 2^31-1],這正是Scala.js中Int的範圍。

相關問題