2

所以我知道这可能是一个非常幼稚的问题,但我是 Scala 和其他类似语言的新手,这让我很困惑。

为什么 Scala(和其他语言)有两个不同的整数和双精度类?既然整数在 floats 中(1.0 = 1),为什么还要使用 Int 类呢?

我有点理解,也许您想确保某些整数永远不会变成浮点数,或者您可能想防止出现1.00000000002 != 1像我失踪的理由?

谢谢!

4

3 回答 3

3

整数对于软件的内部工作很重要,因为许多东西在内部实现为整数,你不一定会认为是“数字”。例如,内存地址一般用整数表示;单个八位字节通常被认为是一字节整数;和字符(例如 ASCII 字符和 Unicode 字符)通常由整数值代码点标识。(在所有这些情况下,顺便说一下,在我们想要显示它们的极少数情况下,我们通常使用十六进制表示法,这很方便,因为它每 8 位字节恰好使用两个字符。)另一个重要的情况,通常即使在编程之外也被认为是数字,是数组索引;即使在数学中,长度为 3 的数组也会有编号为 1、2 和 3 的元素(尽管在编程中,包括 Scala 在内的许多语言将使用索引 0、1 和 2,有时是因为映射的底层方案内存地址的索引,有时是由于与旧语言相关的历史原因,因此)。

更一般地说,计算(以及现实世界)中的许多事物都是严格量化的;写“ 2.4表行”或“2.4 循环迭代”是没有意义的,因此使用算术精确并表示精确整数数量的数据类型很方便。

但是你说得对,区别并不是绝对必要的。许多脚本语言,例如 Perl 和 JavaScript 和 Tcl,大部分都放弃了整数和浮点数之间的显式区别(尽管这种区别仍然经常在解释器的工作中出现,在需要时会隐式地进行转换) . 例如,在 JavaScript 中,typeof 3并且typeof 3.0都是'number'.

于 2013-09-07T01:50:21.023 回答
3

整数通常更容易使用,因为它们具有精确的表示。这不仅在软件层面如此,在硬件层面也是如此。例如,查看描述 x86 架构的源代码,浮点加法通常比整数加法花费 4 倍的时间。因此,出于性能原因和可用性原因将两种类型的操作分开是有利的。

于 2013-09-07T02:06:33.617 回答
0

要添加到其他两个答案,整数实际上并不是浮点数。也就是说,有些整数不能用浮点数精确表示:

scala> Int.MaxValue.toFloat == (Int.MaxValue - 1).toFloat
res0: Boolean = true

多头和双打也一样。

于 2013-09-07T15:24:16.667 回答