Java 中的截断是什么?

2025年5月3日 | 阅读 6 分钟

truncate 的英文意思是修剪削减,或者切断某物,而修剪的过程称为截断。在计算机科学领域,这个词经常用于指代数据类型或变量(如 String、浮点数等)。这是一种近似的方法。让我们来讨论Java 中的截断是什么以及如何通过 Java 程序截断浮点数或双精度数

截断

Java 编程中,截断意味着从右侧修剪 floatdouble 类型数字的某些数字,或字符串的某些字符。我们还可以完全截断小数部分,使其成为整数

换句话说,截断是一种数学运算,它涉及删除数字小数点后的数字,有效地向下舍入到零。

例如,截断 3.75 将得到 3。在 Java 中,截断通常发生在将浮点数转换为整数数据类型(如 int 或 long)时。

请记住,截断后,数字不会四舍五入到最近的值。因此,截断是一种近似的方法

它通常用于计算(尤其是在数据库和编程中),当使用整数进行除法并且结果必须是整数时。

注意:截断和四舍五入是两个完全不同的概念。它与 Math.floor()Math.ceil()Math.round() 函数(在 Math 类中)不同。

现在我们已经清楚地理解了截断的概念。让我们看看截断浮点数或双精度数以及字符串的一些方法。

示例

假设有一个双精度数 num=19.87874548973101。要求小数点后只有 3 位数字。在这种情况下,我们应用截断。截断其余数字后,我们得到 19.878

如果截断小数点后的所有数字,则变为 19。如果数字被四舍五入到最近的整数,则变为 20

What is truncation in Java

现在我们已经清楚地理解了截断。让我们看看截断浮点数或双精度数以及字符串的一些方法。

截断类型

有两种截断类型

  • 隐式截断
  • 显式截断

隐式截断

隐式截断发生在涉及混合数据类型的某些操作中。当我们执行涉及整数和浮点数的算术运算时,Java 会在执行操作之前自动将整数操作数提升为浮点值。但是,当将结果存储回整数变量时,Java 会在没有明确指示的情况下截断小数部分。

在此示例中,d + i 的结果是浮点值 (15.78),当存储在 result 变量中时,该值被截断为整数 (15)。

显式截断

显式截断发生在我们通过类型转换将浮点数的整数部分丢弃,将其转换为整数类型时。Java 提供了内置方法和运算符来进行显式截断。

在此,(int) 转换运算符显式地将值截断为整数,结果为 7。

截断方法

有两种截断数字的方法

  • 使用数学逻辑
  • 使用字符串匹配

使用数学逻辑

我们可以通过以下步骤截断数字

  1. 通过将数字乘以 10dp(其中 dp 是小数位数),将指定数字 (n) 的小数点移动到给定的十进制位置 (dp)。
  2. 确定步骤 1 中获得的结果值的地板值。
  3. 将地板值除以 10dp

从步骤 3 中获得的值就是截断后的值。

如果我们用数学表示上述步骤,我们将得到

  • n = n*pow(10,decimalplace);
  • n = floor(n);
  • n = n / pow(10,decimalplace);

示例:将 1.231 截断到小数点后 2 位。

n=1.231*pow(10,2)
n=1.231*100 =123.100
n=floor(123.100) = 123
n=123/pow(10,2)
n=123/100 = 1.23

让我们在 Java 程序中实现上述逻辑。

TruncationExample1.java

输出

The number before truncation is: 19.87874548973101
The number after truncation is: 19.87874

使用字符串匹配

  1. 将 double 或 float 类型转换为字符串
  2. 找到字符串中的小数点
  3. 递增变量(count),直到找到小数点。
  4. 存储新字符串并将其传递给parseDouble() 方法。该方法返回字符串表示的双精度值。

从步骤 4 中获得的值就是截断后的值。

让我们在 Java 程序中实现上述步骤。

TruncationExample2.java

输出

The number before truncation is: 556.9871233986399
The number after truncation is: 556.987

我们也可以 修剪 Java 中的字符串。为此,Java String 类提供了 trim() 方法。

截断的陷阱和最佳实践

虽然截断是一种常见操作,但如果处理不当,它可能导致精度丢失和意外结果。以下是一些需要考虑的最佳实践:

  • 注意数据丢失:在删除浮点数时,始终要注意可能发生的数据丢失。了解应用程序的范围和准确性,以最大程度地减少任何意外后果。
  • 截断的用例:当你需要显式地丢弃数字的小数部分时,例如处理不需要小数位的金融数据时,通常会使用截断。
  • 考虑替代方法:在精度至关重要的场景中,请考虑使用四舍五入方法 (Math.round()) 而不是截断来确保准确性。
  • 文档和代码清晰性:在代码中清楚地记录任何截断操作,以避免其他开发人员的混淆。使用有意义的变量名和注释来指示截断的意图。
  • 测试边缘情况:严格测试你的代码,特别是对于截断可能产生意外行为的边缘情况,例如处理非常大或非常小的数字时。

结论

截断在算术运算中起着重要作用,尤其是在处理 Java 中的浮点数时。无论是隐式还是显式,理解截断的工作原理并编写健壮可靠的代码都很重要。通过遵循最佳实践和采取预防措施,你可以有效地使用截断,从而降低 Java 应用程序中精度损失和不可预测行为的风险。