在 Java 中,要获取 double 类型数值的小数点后两位,有几种常见的方法,根据你的具体需求(是四舍五入后显示,还是直接截断),可以选择不同的方法。

下面我将介绍几种最常用的方法,并附上代码示例和说明。
使用 String.format() (推荐,用于格式化输出)
这是最简单、最直接的方法,适用于将 double 格式化为一个保留两位小数的字符串,通常用于显示或打印。
特点:
- 四舍五入:默认会进行四舍五入。
- 返回字符串:结果是
String类型,不能直接用于后续的数学计算。 - 非常灵活:可以轻松修改格式,比如保留1位、3位小数,或者添加千位分隔符等。
代码示例:

public class DoubleFormatting {
public static void main(String[] args) {
double number1 = 123.4567;
double number2 = 10.1;
double number3 = 99.994;
// 使用 String.format() 格式化为两位小数的字符串
String formatted1 = String.format("%.2f", number1);
String formatted2 = String.format("%.2f", number2);
String formatted3 = String.format("%.2f", number3);
System.out.println("原始值: " + number1 + " -> 格式化后: " + formatted1); // 输出: 123.46
System.out.println("原始值: " + number2 + " -> 格式化后: " + formatted2); // 输出: 10.10
System.out.println("原始值: " + number3 + " -> 格式化后: " + formatted3); // 输出: 99.99 (注意,这里会四舍五入为99.99)
}
}
解释:
"%.2f"是格式化字符串。- 表示格式说明符的开始。
.2:表示保留两位小数。f:表示这是一个浮点数(float 或 double)。
使用 DecimalFormat (推荐,用于格式化输出)
DecimalFormat 是 java.text 包中的一个类,专门用于格式化数字,它比 String.format() 更强大,提供了更多本地化的格式化选项。
特点:
- 四舍五入:同样会进行四舍五入。
- 返回字符串:结果是
String类型。 - 功能强大:可以设置分组大小(千位分隔符)、货币符号、舍入模式等。
代码示例:

import java.text.DecimalFormat;
public class DecimalFormatExample {
public static void main(String[] args) {
double number = 1234567.8912;
// 创建一个 DecimalFormat 对象,模式是保留两位小数
DecimalFormat df = new DecimalFormat("#.##");
// 格式化数字
String formattedNumber = df.format(number);
System.out.println("原始值: " + number + " -> 格式化后: " + formattedNumber); // 输出: 1234567.89
// 另一个例子,添加千位分隔符
DecimalFormat dfWithSeparator = new DecimalFormat("#,###.00");
String formattedWithSeparator = dfWithSeparator.format(number);
System.out.println("带千位分隔符: " + formattedWithSeparator); // 输出: 1,234,567.89
}
}
解释:
- 是模式字符串。
- 代表一个数字,如果该位没有数字则不显示。
- 小数点。
0:代表一个数字,如果该位没有数字则显示0。"0.00"会格式化1为10。
使用 BigDecimal (推荐,用于精确计算)
如果你需要保留两位小数并进行数学运算,或者需要精确控制舍入模式,BigDecimal 是最佳选择。double 和 float 在计算机中存储的是近似值,直接进行运算可能会导致精度丢失。
特点:
- 精确计算:避免了
double的精度问题。 - 可控制舍入模式:可以明确指定是
ROUND_HALF_UP(四舍五入)、ROUND_DOWN(直接截断) 等。 - 返回
BigDecimal对象:需要再转换回double或String。
代码示例:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalExample {
public static void main(String[] args) {
double number = 123.456;
// 1. 将 double 转换为 BigDecimal (推荐使用 String 构造函数以避免精度问题)
BigDecimal bd = new BigDecimal(String.valueOf(number));
// 2. 设置保留两位小数,并指定舍入模式为四舍五入
BigDecimal rounded = bd.setScale(2, RoundingMode.HALF_UP);
// 3. 将结果转换回 double
double resultDouble = rounded.doubleValue();
System.out.println("原始值: " + number + " -> 四舍五入后(double): " + resultDouble); // 输出: 123.46
// 4. 转换为字符串
String resultString = rounded.toString();
System.out.println("原始值: " + number + " -> 四舍五入后(String): " + resultString); // 输出: 123.46
// 示例:直接截断(不舍入)
BigDecimal truncated = bd.setScale(2, RoundingMode.DOWN);
System.out.println("原始值: " + number + " -> 直接截断后: " + truncated); // 输出: 123.45
}
}
重要提示:
- 避免使用
new BigDecimal(double):由于double本身就不精确,用new BigDecimal(123.456)可能会引入额外的误差,推荐使用new BigDecimal("123.456"),通过String构造可以保证精度。
使用 Math.round() (不推荐,有精度陷阱)
这种方法通过将数字放大、取整、再缩小来模拟四舍五入,虽然可行,但存在 double 精度问题,不推荐在生产代码中使用。
特点:
- 四舍五入。
- 返回
long或int,需要再转换回double。 - 有精度风险:对于某些数字,由于浮点数的表示方式,可能会得到不正确的结果。
代码示例:
public class MathRoundExample {
public static void main(String[] args) {
double number = 123.456;
// 1. 乘以 100
double temp = number * 100; // 12345.6
// 2. 四舍五入取整
long roundedLong = Math.round(temp); // 12346
// 3. 除以 100.0 (注意用 100.0 保证结果是 double)
double result = roundedLong / 100.0;
System.out.println("原始值: " + number + " -> 四舍五入后: " + result); // 输出: 123.46
}
}
总结与选择
| 方法 | 主要用途 | 是否四舍五入 | 返回类型 | 推荐度 | 备注 |
|---|---|---|---|---|---|
String.format() |
格式化输出(打印、显示) | 是 | String |
⭐⭐⭐⭐⭐ | 简单直接,最常用。 |
DecimalFormat |
格式化输出(打印、显示) | 是 | String |
⭐⭐⭐⭐ | 功能比 String.format 更丰富,适合复杂格式。 |
BigDecimal |
精确计算和格式化 | 可配置 | BigDecimal / double |
⭐⭐⭐⭐⭐ | 金融、货币计算的首选,能避免精度问题。 |
Math.round() |
简单的数值运算 | 是 | long / int |
⭐ | 不推荐,存在潜在的精度陷阱。 |
如何选择?
- 如果你只是想把数字显示给用户看:使用
String.format("%.2f", yourDouble)或DecimalFormat。 - 如果你需要对数字进行精确的数学运算(比如计算价格):必须使用
BigDecimal。 - 尽量避免使用
Math.round()来处理小数位的四舍五入。
