Java long 转 int

24 Oct 2024 | 10 分钟阅读

将 long 转换为 int 会导致潜在的数据丢失,因为 long 可以存储比 int 更大的值。Java 有多种转换方法,您必须根据特定需求选择最佳方法。以下是将 long 转换为 int 的一些方法。

Java Convert long to int

Java 使用类型转换将 long 转换为 int

在 Java 中,类型转换是将 `long` 转换为 `int` 最简单的方法。类型转换的基本优点在于其简单性和简洁性。它是一种简单的结构,将 `long` 值放在 `(int)` 目标类型括号内。当您确信 long 值在 int 的范围内时,可以使用此形式。它是一种快速简便的方法,无需额外实现类或方法即可实现转换。

尽管如此,类型转换也有其缺点,可能导致数据丢失。假设要转换的 `long` 值大于 `int` 可以表示的最大值。在这种情况下,由于没有足够的位来正确表示 `long` 值,结果将是一个错误的 `int` 值。精度丢失可能导致应用程序出现意外和不准确的结果。因此,尽管类型转换节省时间,但有必要注意数据范围,以防止出现意外结果。在精度和数据丢失高度敏感的情况下,使用 `Math.toIntExact()` 或 `BigInteger` 等替代方法可能是更好的选择。这样,近似方法还可以作为防止溢出的屏障,并能更有效地处理更大的数字。

让我们来看一个在 Java 中将 long 转换为 int 的简单代码。

LongToIntExample.java

输出

Scenario 1:
Original long value: 12345
Converted int value: 12345
Scenario 2:
Original long value: 2147483649
Converted int value: -2147483647
Warning: Casting may result in data loss if the long value exceeds Integer.MAX_VALUE 

Java 使用 Math.floor() 或 Math.ceil() 方法将 long 转换为 int(四舍五入法)

在 Java 中使用 Math.floor() 或 Math.ceil() 进行四舍五入以将 long 转换为 int 具有各自的优缺点。

Math.floor() 或 Math.ceil() 的优点

四舍五入精度:这些技术可以对 long 值进行受控四舍五入,与直接类型转换相比,转换后的 int 精度更高。Math.floor() 向下取整,而 Math.ceil() 向上取整,因此您可以根据特定需求选择取整方向。

明确的四舍五入策略:可以通过应用 Math.floor() 或 Math.ceil() 技术来实现这一点,从而明确定义四舍五入策略,指示转换如何处理 long 值的小数部分。在需要精确数字四舍五入的情况下,这可能很有用。

Math.floor() 或 Math.ceil() 的缺点

潜在的数据丢失:向下取整虽然可以减少精度损失,但当 long 值大于 int 可表示的最大值时,并不能防止数据丢失。实际上,如果大值不够大,四舍五入可能是处理溢出或截断的唯一可用工具。

复杂性:与简单的直接操作类型转换相比,使用 Math.floor() 和 Math.ceil() 方法涉及额外的函数调用,并且被认为更复杂。如果此方法的唯一目的是防止大 long 值的溢出,则这种复杂性可能是多余的。

让我们来看一个在 Java 中将 Long 转换为 int 的简单代码。

LongToIntRoundingExample.java

输出

Original long value: 12345
Rounded (Floor) int value: 12345
Rounded (Ceil) int value: 12345

Java 使用 Math.toIntExact() 方法将 long 转换为 int

Java 中的 Math.toIntExact() 技术旨在将 long 转换为 int,并为潜在的溢出问题提供了更精确的解决方案。以下是使用 Math.toIntExact() 的优缺点。

Math.toIntExact() 的优点

异常处理:当转换可能发生溢出时,Math.toIntExact() 会抛出 ArithmeticException。这种特定的处理方法显然可以阻止与数据丢失相关的意外和有害影响。

数据完整性:通过 Math.toIntExact(),您可以优先考虑数据安全,避免错误和截断值的可能性。这在需要精确数字表示以进行正确计算或处理大量数据的情况下尤其重要。

Math.toIntExact() 的缺点

异常处理开销:处理异常的要求增加了代码的复杂性,因为开发人员必须插入 try-catch 块来处理可能的 ArithmeticException。这可能会使代码更加冗长,并且这种间接性可能会导致其与直接类型转换相比显得不够简洁。

性能影响:总的来说,异常处理会产生性能开销。虽然在其他情况下,这种影响可能微不足道,但如果在代码的关键性能部分重复执行转换,处理异常的开销将成为一个严重问题。

让我们来看一个在 Java 中将 Long 转换为 int 的简单代码。

LongToIntExactExample.java

输出

Original long value: 12345
Converted int value: 12345

Java 使用 BigInteger.intValue() 方法将 long 转换为 int

Java 中的 BigInteger.intValue() 方法提供了关于如何将 BigInteger(它可以表示任意大小的整数)转换为 int 的详细方法。以下是使用 BigInteger.intValue() 方法的优缺点。

BigInteger.intValue() 的优点

任意精度:BigInteger 具有任意精度的整数表示;因此,它可以显示大于 int 的值。此技术适用于需要保留大数值的场景。

无溢出风险:由于 BigInteger 可以表示任意大小的整数,因此在转换为 int 时不会发生溢出。intValue() 方法提取 BigInteger 值中较低的位,以确保在安全转换过程中不会丢失任何数据。

一致且可预测的行为:通过使用 BigInteger,可以确保在各种输入值下具有相同的行为。这因此消除了复杂的代码和手动处理异常情况的方法,而这些情况可能会在直接类型转换或其他方法中发生。

BigInteger.intValue() 的缺点

对象创建开销:创建 BigInteger 对象所需的时间比 int 和 long 等简单数据类型要长。当精度至关重要时,这种创建和操作 BigInteger 对象的开销可能会成为一个问题。

方法调用复杂性:BigInteger 类的 intValue() 方法意味着调用一个方法,该方法本身可能会使代码复杂化。与直接类型转换相比,这一点最为明显。

让我们来看一个在 Java 中将 Long 转换为 int 的简单代码。

BigIntegerToIntExample.java

输出

Original BigInteger value: 123456789012345678901234567890
Converted int value: 1312754386

Java 使用 String 和 parseInt 方法将 long 转换为 int

Java 语言提供了 String 和 parseInt 方法来将 long 转换为 int。这些方法也有其优缺点。

String 和 parseInt 方法的优点

简单性:这种简单的技术可以快速应用。它将 long 转换为 String,然后再转换为 int,从而使代码简洁易读。

灵活性:Java 中的 String 类型数字提供了灵活性。它可以以任何形式重新塑造数字,或在将其存储为 int 之前进行重新排列。

清晰的错误处理:当 String 表示不是有效的整数时(例如,包含非数字字符),parseInt 方法会抛出 NumberFormatException。这使得情况非常清晰:现在您可以捕获并处理无效输入。

String 和 parseInt 方法的缺点

性能开销:将 long 转换为 String,然后从 String 构建 int,会比直接类型转换或其他方法引入额外的计算开销。它需要额外的计算和对象创建,因此在性能密集型软件中可能会降低性能。

潜在的精度丢失:parseInt 用于解析整数,因此在处理大 long 时可能会失败。如果 long 的值超出 int 的有效范围,此函数将导致溢出,可能丢失精度。

异常处理开销:然而,NumberFormatException 所展示的更优越的方法涉及异常处理。在涉及大量解析的情况下,这可能会对性能产生负面影响。

让我们来看一个在 Java 中将 Long 转换为 int 的简单代码。

LongToIntConversion.java

输出

Long value: 123456789
Int value using String and parseInt: 123456789

Java 使用 BigDecimal 类将 long 转换为 int

在 Java 中使用 BigDecimal 类将 long 转换为 int 具有积极和消极的后果。

BigDecimal 类的优点

任意精度:BigDecimal 采用任意精度的算术,允许它在不牺牲精度的情况下对非常大和非常小的数字进行计算。如果变量超出了 long 和 int 等数据类型的范围,这会有所帮助。

准确的小数表示:BigDecimal 允许准确表示小数,而不会出现浮点类型(如 double 和 float)有时会发生的舍入误差。这在金融计算和其他精度很重要的场合尤其关键。

灵活的标度处理:在将 BigDecimal 转换为整数时,您可以设置标度(小数点右边的位数)。这可以根据您的具体需求创建行为和精度设置。

BigDecimal 类的缺点

性能开销:与 long 和 int 等基本数据类型相比,BigDecimal 操作通常更慢,内存消耗更大。这在性能方面很重要,尤其是在性能敏感型应用程序或处理大型数据集时。

复杂性:使用 BigDecimal 比使用基本数据类型更复杂,因为 BigDecimal 类有大量的舍入、标度等方法。这是通过细致地处理标度、舍入和算术运算来实现的,以便能够获得准确的结果。

不可变性:BigDecimal 的实例是不可变的;当对其进行操作时,会创建新对象,而不是修改现有对象。这可能会导致更多的内存使用和开销,尤其是在进行密集算术运算的操作中。

让我们来看一个在 Java 中将 Long 转换为 int 的简单代码。

LongToIntConversion.java

输出

Long value: 123456789
Int value using BigDecimal: 123456789

Java 使用 NumberFormat 类将 long 转换为 int

在 Java 中使用 NumberFormat 类将 long 转换为 int 也具有优点和缺点。

NumberFormat 类的优点

本地化支持:NumberFormat 提供基于本地化的格式化功能,以满足需要根据不同社会规范显示数字的应用程序的需求。

灵活的格式化选项:通过这种方式,您可以配置数字格式,指定数字位数、分组大小、分组和十进制分隔符。

易用性:NumberFormat 类是 Java 标准库的一部分,使用起来通常很简单。它使得根据特定格式规则格式化和解析数字的过程更加容易。

NumberFormat 类的缺点

性能开销:虽然 NumberFormat 具有灵活性,但与直接类型转换或位运算等简单方法相比,它可能太慢了。在性能关键型系统中,这种担忧可能很重要。

复杂性:NumberFormat API 可能比简单的方法更复杂;对于不熟悉格式化和解析细节的开发人员来说,它可能很难。考虑到这一点,如果您只需要简单的转换,它是不必要的。

不适用于显式类型转换:然而,NumberFormat 更侧重于格式化和解析字符串,它不像其他专门用于转换的方法那样直观——例如,将 long 转换为 int。

让我们来看一个在 Java 中将 Long 转换为 int 的简单代码。

LongToIntConversion.java

输出

Long value: 123456789
Int value using NumberFormat: 123456789