【问题标题】:Why are there 'Int's **and** 'Double's? Why not just have one class?为什么会有'Int's **和** 'Double's?为什么不只上一节课?
【发布时间】:2013-09-07 01:28:13
【问题描述】:

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

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

我有点理解,也许您想确保某些整数永远不会变成浮点数,或者您可能想防止出现像 1.00000000002 != 1 这样的事件,当您只看到前几个数字时可能会感到困惑,但是我还缺少其他一些潜在的理由吗?

谢谢!

【问题讨论】:

  • 因为有时 int 是合适的,有时是 double

标签: scala int double


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    整数通常更容易使用,因为它们具有精确的表示。这不仅在软件层面如此,在硬件层面也是如此。例如,查看this source describing the x86 architecture,浮点加法通常比整数加法耗时 4 倍。因此,出于性能原因和可用性原因,将这两种操作分开是有利的。

    【讨论】:

      【解决方案3】:

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

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

      long 和 double 相同。

      【讨论】:

        猜你喜欢
        • 2019-12-04
        • 2021-08-28
        • 2022-12-04
        • 2011-06-26
        • 1970-01-01
        • 2018-05-08
        • 2014-10-08
        • 2014-12-04
        • 1970-01-01
        相关资源
        最近更新 更多