所以我知道这可能是一个非常天真的问题,但我是Scala和其他类似语言的新手,这合法地困扰着我。
为什么Scala(和其他语言)有两个不同的整数和双精度类?由于整数是浮点数(1.0 = 1)
,为什么还要使用Int类呢?
我有点明白,也许你想确保某些整数永远不会变成浮点数,或者你想要防范像1.00000000002 != 1
这样的事件,当你只看到前几个时可能会让人感到困惑数字,但是我还缺少其他一些潜在的理由吗?
谢谢!
答案 0 :(得分:3)
整数对于软件的内部工作非常重要,因为很多东西都是内部实现的整数,你不一定会想到这些整数和#34;数字"。例如,存储器地址通常表示为整数;个别的8位字节通常被认为是一个字节的整数;和字符(例如ASCII字符和Unicode字符)通常由整数值代码点标识。 (在所有这些情况下,偶然地,在我们想要显示它们的极少数情况下,我们通常使用十六进制表示法,这很方便,因为它每8位字节使用两个字符。)另一个重要的情况,通常是 甚至在编程之外被认为是数字,是数组索引;即使在数学中,长度为3的数组也会有编号为1,2和3的元素(尽管在编程中,许多语言 - 包括Scala - 将使用索引0,1和2来代替,有时因为映射的基础方案内存地址的索引,有时是由于与旧语言相关的历史原因而导致这样做的原因。)
更一般地说,计算中(以及现实世界中)的许多东西都是严格量化的;编写" 2.4表行"或者#34; 2.4循环迭代"没有意义,所以拥有数据很方便算术精确的类型,并表示精确的整数。
但你是对的,这种区别并非绝对必要;许多脚本语言,例如Perl和JavaScript以及Tcl,大多数都没有明确区分整数和浮点数(虽然这种区别仍然经常在解释器的工作中得出,转换在需要时隐式发生) 。例如,在JavaScript中,typeof 3
和typeof 3.0
都是'number'
。
答案 1 :(得分:3)
整数通常更容易使用,因为它们具有精确的表示。这不仅适用于软件级别,也适用于硬件级别。例如,查看this source describing the x86 architecture,浮点加法通常比整数加法长4倍。因此,出于性能原因以及可用性原因,将两种类型的操作分开是有利的。
答案 2 :(得分:0)
要添加到其他两个答案,整数不实际上在浮点数中。也就是说,有些整数不能用float表示:
scala> Int.MaxValue.toFloat == (Int.MaxValue - 1).toFloat
res0: Boolean = true
同样的多头和双打。