Java 中如何将 double 和 float 四舍五入到两位小数?

2025年2月12日 | 阅读 6 分钟

在 Java 中将 double 和 float 值四舍五入到小数点后两位,对于处理货币、精确测量或任何需要精确表示浮点数的应用程序来说,都是一个常见的需求。Java 提供了多种方法和类来实现这一点。在这里,我们将详细讨论各种方法,包括使用 BigDecimal 类、DecimalFormat 和其他实用方法。

当我们在变量前面使用 double 数据类型时,它表示小数点后有 15 位数字。但有时我们只需要小数点后两位,例如表示货币单位。因此,在本节中,我们将讨论将double 和 float 四舍五入到小数点后两位的方法,并提供相应的示例和 Java 程序。

How to Round Double and Float up to Two Decimal Places in Java

Java 提供了以下三种方法将 double 显示为两位小数:

  1. 使用 DecimalFormat 类 ("0.00")
  2. 使用 String.format() 方法 ("%.2f")
  3. 使用 BigDecimal 类
  4. 使用 Math.round() 方法
  5. 使用自定义实用方法

让我们逐一讨论以上方法。

使用 DecimalFormat 类

Java 的 DecimalFormat 是 NumberFormat 类的具体子类,用于格式化十进制数字。该类提供了 setRoundingMode() 方法来将 double 数字显示到小数点后两位。

语法

它接受 rounding mode 作为参数,并覆盖 NumberFormat 类的 setRoundingMode() 方法。如果我们没有指定任何 roundingMode,它会抛出 NullPointerException。下表描述了不同的 rounding modes。

放入数字UP向下舍入CEILINGFLOORHALF_UPHALF_DOWNHALF_EVENUNNECESSARY
5.56565656抛出 ArithmeticException
2.53232322抛出 ArithmeticException
1.62121222抛出 ArithmeticException
1.12121111抛出 ArithmeticException
1.011111111
-1.0-1-1-1-1-1-1-1-1
-1.1-2-1-1-2-1-1-1抛出 ArithmeticException
-1.6-2-1-1-2-2-2-2抛出 ArithmeticException
-2.5-3-2-2-3-3-2-2抛出 ArithmeticException
-5.5-6-5-5-6-6-5-6抛出 ArithmeticException

我们还使用了 DecimalFormat 类的另一个方法是 format() 方法。它将一个字符串格式化为另一个字符串。

语法

该方法接受三个参数:number、result 和 position。但最后两个参数是可选的。它返回格式化后的数字字符串。如果 RoundingMode 设置为 UNNECESSARY,该方法会抛出 ArithmeticException

TwoDecimalPlace1.java

输出

Double Number: 123.9876543567
Double Number: 123.99

Before Rounding: 123.98
After Rounding Up: 123.99

使用 String.format() 方法

Java 还提供了 format() 方法来格式化数字。它属于 String 类。通过使用该方法,可以相应地格式化任何数字和字符串。

为了将数字调整到小数点后两位,我们使用 %.2f 来格式化数字。请注意,我们不能在 String.format() 方法中四舍五入数字,它总是采用四舍五入(HALF_UP)。

语法

该方法接受以下两个参数:

format: 这是我们想要的格式化字符串。

args: 这些是由格式字符串中的格式说明符引用的参数。

它返回格式化后的字符串。如果格式字符串包含非法语法,则抛出 IllegalFormatException。如果我们将格式指定为 null,它还会抛出 NullPointerException

TwoDecimalPlace2.java

输出

Double Number: 10.98765432167
Double Number: 10.99
Double Number: 10.99

使用 BigDecimal 类

我们还可以使用 Java 的 BigDecimal 类将数字显示到小数点后两位。它扩展了 Number 类并实现了 Comparable<BigDecimal> 接口。BigDecimal 类提供对十进制值进行任意精度算术运算的功能,并且是 java.math 包的一部分。它是 Java 中处理十进制数最精确的方式,尤其是在涉及四舍五入时。

该类提供了 setScale() 方法。语法如下:

语法

该方法接受两个参数:

newScale: 要返回的 BigDecimal 值的精度。

roundingMode: 我们要应用的四舍五入模式。

它返回一个精度为指定值且未标度值通过将此 BigDecimal 的未标度值乘以或除以适当的十的幂来确定的 BigDecimal,以保持其整体值。

如果 RoundingMode 设置为 UNNECESSARY,该方法将抛出 ArithmeticException。RoundingMode 是一个枚举,提供了上面讨论的 RoundingMode。

我们在程序中使用的另一个方法是 BigDecimal.doubleValue()。它将 BigDecimal 转换为 double 数。让我们看一个示例。

TwoDecimalPlace3.java

输出

Double Number: 12.4565652239
Up to two decimal places: 12.46

使用 Math.round() 方法

Math.round() 方法可以四舍五入浮点数,但它四舍五入到最近的整数。要四舍五入到两位小数,需要进行一些操作。

文件名:RoundUsingMathRound.java

输出

Rounded value: 123.46

使用自定义实用方法

自定义实用方法可以将上述方法结合起来,用于可重用代码。

文件名:RoundUtility.java

输出

Rounded value: 123.46

方法比较

  • BigDecimal: 最精确,推荐用于货币计算。
  • DecimalFormat: 适用于格式化数字以供显示。
  • round: 简单但对于非整数四舍五入的灵活性较低。
  • format: 方便快速格式化。

性能考虑

  • BigDecimal: 由于精度较高和对象操作,速度稍慢。
  • round 和 String.format: 适用于简单情况,但通用性较差。
  • DecimalFormat: 性能均衡,适合显示格式化。

四舍五入浮点数的常见错误

  • 浮点数精度: 由于其二进制表示,直接操作浮点数通常会导致不准确,这可能导致计算结果出乎意料。
  • 错误的四舍五入模式: 使用错误的四舍五入模式可能导致值不正确。始终选择符合应用程序要求的四舍五入模式,例如典型的四舍五入使用 RoundingMode.HALF_UP。
  • 使用 float 而不是 double: float 的精度低于 double,可能导致显著的四舍五入误差。为了获得更好的精度,请优先使用 double。
  • 字符串转换错误: 如果处理不当,尤其是在影响数字格式的国际化设置下,将数字转换为字符串进行格式化可能会导致错误。
  • 忽略边缘情况: 未考虑 NaN(非数字)、正/负无穷大以及非常大或非常小的数等特殊值,可能导致四舍五入逻辑失败。

结论

在 Java 中将浮点数四舍五入到小数点后两位可以通过多种方法实现,每种方法都有其用例和权衡。对于大多数应用程序,BigDecimal 提供了最精确的四舍五入控制,而 DecimalFormat 和 String.format 则提供了方便的数字显示格式化方式。理解和选择正确的方法取决于您应用程序的特定需求,尤其是在精度和性能方面。


下一主题Java 8 Multimap