【问题标题】:Type Conversion in Java Double to IntJava Double 到 Int 的类型转换
【发布时间】:2017-12-31 00:46:18
【问题描述】:

我正在尝试将 2147483648 的双精度值转换为整数,在进行类型转换后,我得到的输出为 2147483647,数字减 1。我知道这是因为溢出而发生的,但是有没有办法让我可以在不丢失精度的情况下将其转换为 int 类型吗?

【问题讨论】:

  • 不幸的是没有。但如果适用,请考虑使用long
  • double 甚至可以超出 long 的范围,但在这种情况下就可以了

标签: java type-conversion


【解决方案1】:

如前所述,您可以使用long 原始数据类型或BigInteger 引用类型。使用整数数据类型而不是浮点数会更好地精确表示整数。

附带说明,从 Java SE 8 开始,可以使用 Integer 类将 int 用于无符号算术。根据 Oracle 文档 - “使用 Integer 类将 int 数据类型用作无符号整数”。无符号整数的最大值大于 int。这个问题可以用:Declaring an unsigned int in Java

这是我的第一个答案,希望您解决了您的问题! :)

【讨论】:

    【解决方案2】:

    我能想到 2 个选项。

    int 不同,int 是 32 位有符号整数数据类型,long 是 64 位有符号整数数据类型。这意味着它可以存储的最大值是9223372036854775807。您尝试存储的数字 2147483648 正好在该范围内。

    大整数

    这是一个表示“不可变任意精度整数”的引用类型。您可以通过以下方式创建一个代表 2147483648 的 BigInteger 实例

    new BigInteger("2147483648")
    

    在此处了解更多信息:https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html

    【讨论】:

      【解决方案3】:

      最大值

      Integer 类中由static final int MAX_VALUE 指示的最大整数是2^31-1 (2,147,483,647)。该值是最大整数,因为它是最大的 32 位有符号整数。

      static final int MAX_VALUEDouble 类中所指示的,最大双精度为(2-2^(-52))(2^1023)。 double 数据类型遵循双精度 64 位 IEEE 754 floating point 格式来表达范围广泛的动态数值。

      缩小原始转换

      在您的观察中,您有一个值为 2,147,483,648 的双精度数,您尝试通过类型转换将其转换为整数。

      double d = 2147483648;
      int i = (int) d;
      

      原始类型之间的转换允许您将一种原始类型的值转换为另一种。从双精度数转换为整数称为Narrowing Primitive Conversion,其中您:

      “可能会丢失有关数值整体大小的信息,也可能会丢失精度和范围。”

      浮点数到int的窄化转换如下:

      • 如果浮点数为 NaN,则结果为 int 0。
      • 否则,如果浮点数不是无穷大,则浮点数将四舍五入为整数值 V,使用 IEEE 754 向零舍入模式向零舍入。如果此整数值可以表示为 int,则结果为 V。
      • 否则,以下两种情况之一必须为真:该值必须太小,结果是 int 或 b 类型的最小可表示值。该值必须太大,结果是 int 类型的最大可表示值。

      对于大于 Integer.MAX_VALUE 的 double 值的整数值,为了允许以整数表示,使用 Integer.MAX_VALUE 的值。

      避免损失

      为避免精度损失,您需要转换为原始类型或数值对象,其中最大值大于 2147483648(分辨率允许保持精度)。

      long 原始类型的最大值为 2^63-1 (9.223372e+18),如果您想在数字整数空间中使用数字,这将是一个不错的选择。请注意,虽然 Long.MAX_VALUE 非常大,但由于浮点格式,Double.MAX_VALUE 要大得多。

      double d = 2147483648;
      long i = (long) d;
      

      【讨论】:

        【解决方案4】:

        double 转换为int 将丢失大于Integer.MAX_VALUE 或小于Integer.MIN_VALUE 的数字的精度。无法将超出该范围的数字表示为int。这在数学上是不可能的。

        double 转换为long 也会丢失精度。这将发生在Long.MIN_VALUELong.MAX_VALUE 之外的所有整数上。但第二个问题是double 本身无法表示该范围内的所有整数......因此在转换之前会有精度损失1.

        道德:

        如果您需要精确表示整数,请不要使用浮点数。使用整数类型(byteshortcharintlong)...或BigInteger


        1 - double 是一个 64 位 IEE 浮点数,具有 52 位精度和一个符号位。相比之下,long 的精度为 64 位(包括符号)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-08
          • 2013-06-02
          • 1970-01-01
          • 2016-02-13
          • 1970-01-01
          相关资源
          最近更新 更多