在 Java 中,要将 double 类型保留两位小数,有多种方法可以实现,以下是几种最常用和推荐的方法,并附有详细的说明和示例代码。

使用 String.format() (最推荐,用于显示)
这是最简单、最直接的方法,适用于需要将数字格式化为字符串进行显示或输出的场景,它不会改变原始 double 变量的值,只是生成一个格式化后的字符串。
语法:
String formattedString = String.format("%.2f", yourDouble);
%.2f是格式说明符:- 表示格式化的开始。
.2:表示保留两位小数。f:表示这是一个浮点数 (float 或 double)。
示例代码:
public class DoubleFormatting {
public static void main(String[] args) {
double number = 123.456789;
// 使用 String.format() 保留两位小数
String formattedNumber = String.format("%.2f", number);
System.out.println("原始数字: " + number);
System.out.println("格式化后字符串: " + formattedNumber); // 输出: 123.46 (四舍五入)
// 也可以直接用在 System.out 中
System.out.printf("直接输出: %.2f\n", number); // 输出: 直接输出: 123.46
}
}
优点:

- 语法简洁,易于理解。
- 非常适合用于日志输出、用户界面显示等需要字符串的场景。
缺点:
- 返回的是一个
String类型,如果后续需要进行数学运算,还需要将其转换回double,可能会有精度损失。
使用 DecimalFormat (推荐,用于本地化和更复杂的格式)
DecimalFormat 是 java.text 包中的一个类,它提供了更强大的格式化功能,比如可以指定千位分隔符、不同地区的数字格式等。
步骤:
- 创建
DecimalFormat的实例,并指定格式模式。 - 调用
format()方法进行格式化。
示例代码:
import java.text.DecimalFormat;
public class DecimalFormatExample {
public static void main(String[] args) {
double number = 1234567.8901;
// 创建一个 DecimalFormat 对象,模式是保留两位小数
DecimalFormat df = new DecimalFormat("#.##");
// 格式化数字
String formattedNumber = df.format(number);
System.out.println("原始数字: " + number);
System.out.println("格式化后字符串: " + formattedNumber); // 输出: 1234567.89
// 带千位分隔符的例子
DecimalFormat dfWithSeparator = new DecimalFormat("#,###.00");
System.out.println("带千位分隔符: " + dfWithSeparator.format(1234567.8901)); // 输出: 1,234,567.89
}
}
优点:
- 功能强大,可以处理复杂的本地化格式。
- 与
String.format()类似,返回字符串。
缺点:
- 需要导入
java.text.DecimalFormat类,代码稍显冗长。
使用 Math.round() (用于计算,会改变原始值)
如果你需要在计算过程中将一个 double 四舍五入到指定位数,并得到一个新的 double 结果,可以使用 Math.round()。
原理:
- 将原始数字乘以 100 (10的2次方),把小数点向右移动两位。
- 使用
Math.round()进行四舍五入,得到一个long类型的整数。 - 再将结果除以 100.0,把小数点移回原位,得到一个新的
double。
示例代码:
public class MathRoundExample {
public static void main(String[] args) {
double number1 = 123.456;
double number2 = 123.454;
// 保留两位小数并四舍五入
double roundedNumber1 = Math.round(number1 * 100.0) / 100.0;
double roundedNumber2 = Math.round(number2 * 100.0) / 100.0;
System.out.println("原始数字1: " + number1 + ", 四舍五入后: " + roundedNumber1); // 输出: 123.46
System.out.println("原始数字2: " + number2 + ", 四舍五入后: " + roundedNumber2); // 输出: 123.45
// 也可以使用强制类型转换,但 Math.round() 更推荐
// double rounded = (double) Math.round(number * 100) / 100;
}
}
优点:
- 返回的是一个
double类型,可以直接用于后续的数学计算。 - 精确地进行四舍五入。
缺点:
- 代码比前两种方法稍长。
- 注意: 由于
double本身的精度问题,对于某些极端数字,这种方法可能无法得到100%精确的结果。
使用 BigDecimal (最精确,用于金融和计算)
在涉及金钱、财务等对精度要求极高的场景下,double 和 float 的二进制浮点表示法可能会导致精度丢失。java.math.BigDecimal 是专门为解决高精度计算而设计的类。
步骤:
- 创建
BigDecimal对象,强烈建议使用String构造函数,以避免直接使用double构造时引入的精度问题。 - 使用
setScale()方法设置保留的小数位数。 - 指定舍入模式,
RoundingMode.HALF_UP(四舍五入)。 - 最后使用
doubleValue()或toString()转换结果。
示例代码:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalExample {
public static void main(String[] args) {
// 使用 String 构造函数,避免 double 的精度问题
BigDecimal number = new BigDecimal("123.456789");
// 设置保留两位小数,并使用四舍五入模式
BigDecimal roundedNumber = number.setScale(2, RoundingMode.HALF_UP);
// 转换为 double
double resultDouble = roundedNumber.doubleValue();
// 转换为 String
String resultString = roundedNumber.toString();
System.out.println("原始数字: " + number);
System.out.println("四舍五入后的 double: " + resultDouble); // 输出: 123.46
System.out.println("四舍五入后的 String: " + resultString); // 输出: 123.46
}
}
优点:
- 精度最高,完全避免了浮点数精度问题,是金融计算的首选。
- 功能强大,支持各种舍入模式。
缺点:
- 代码最复杂,需要处理对象而不是基本类型。
- 性能比前几种方法稍差。
总结与选择建议
| 方法 | 返回类型 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
String.format() |
String |
显示、日志、UI输出 | 简单、快捷 | 返回字符串,不用于计算 |
DecimalFormat |
String |
显示、本地化格式 | 功能强大,支持本地化 | 返回字符串,代码稍多 |
Math.round() |
double |
中间计算、数值处理 | 直接得到 double,可用于计算 |
代码稍长,极端情况可能有精度问题 |
BigDecimal |
BigDecimal |
金融、高精度计算 | 精度最高,绝对可靠 | 代码复杂,性能较低 |
如何选择?
- 如果只是想在控制台或界面上显示两位小数:直接使用
String.format(),这是最简单、最直接的方式。 - 如果需要进行数值计算,并且希望结果是一个
double:使用Math.round()。 - 如果处理的是金钱、财务或任何对精度有严格要求的数据:必须使用
BigDecimal,不要犹豫。 - 如果需要更复杂的格式化,比如千位分隔符:使用
DecimalFormat。
对于绝大多数日常开发需求,String.format() 和 Math.round() 已经足够。
