为什么在 Scala.js 中将 Double 用于不 "require" Double 的属性?
Why is Double used in Scala.js for properties which do not "require" Double?
我正在查看 Screen
class(包 org.scalajs.dom.raw
)并注意到以下属性:
def width: Double = js.native
def availHeight: Double = js.native
def height: Double = js.native
是否有任何理由使用 Double
而不是 Int
?我不熟悉 Scala.js 代码,但对我来说使用 Int
.
更有意义
我在这里错过了什么?
有时,看起来总是整数的东西实际上可以取非整数值,正如@Bob Dalgleish 解释的那样。
也有使用 Double
的情况,因为值可以大于 2^31。虽然是整数,但它们超出了 Int
的范围,必须键入 Double
(Long
是不透明的,因此不是 JS 数字的有效表示)。
然而,很多时候 Scala.js 门面类型(尤其是 DOM)使用 Double
仅仅是因为它们是从 TypeScript 类型定义转换而来的,这只有 number
s。 Double
是保守的近似值。在这些情况下,在验证原始规范(通常在 Web IDL 中)后,我们可以将其缩小到 Int
(欢迎 PR,并附有对 Web IDL 规范的 link)。
您提到的 Screen
属性的具体情况属于最后一类。从the original IDL, those values are described as "long
"s. In IDLs, a long
is an integer in the range [-2^31, 2^31-1]中可以看出,正好是Scala.js.
中的一个Int
的范围
我正在查看 Screen
class(包 org.scalajs.dom.raw
)并注意到以下属性:
def width: Double = js.native
def availHeight: Double = js.native
def height: Double = js.native
是否有任何理由使用 Double
而不是 Int
?我不熟悉 Scala.js 代码,但对我来说使用 Int
.
我在这里错过了什么?
有时,看起来总是整数的东西实际上可以取非整数值,正如@Bob Dalgleish 解释的那样。
也有使用 Double
的情况,因为值可以大于 2^31。虽然是整数,但它们超出了 Int
的范围,必须键入 Double
(Long
是不透明的,因此不是 JS 数字的有效表示)。
然而,很多时候 Scala.js 门面类型(尤其是 DOM)使用 Double
仅仅是因为它们是从 TypeScript 类型定义转换而来的,这只有 number
s。 Double
是保守的近似值。在这些情况下,在验证原始规范(通常在 Web IDL 中)后,我们可以将其缩小到 Int
(欢迎 PR,并附有对 Web IDL 规范的 link)。
您提到的 Screen
属性的具体情况属于最后一类。从the original IDL, those values are described as "long
"s. In IDLs, a long
is an integer in the range [-2^31, 2^31-1]中可以看出,正好是Scala.js.
Int
的范围