如何在Java中将double类型保留两位小数

在Java开发中,我们常常需要将double类型的数值保留两位小数,本文将介绍几种常见的方法,并提供相应的代码示例。

方法1: 使用String.format()

double dou = 3.14789;
String douStr = String.format("%.2f", dou);
System.out.println("douStr:" + douStr);

注:

  • 该方法会进行四舍五入,并且位数不够时会用0补齐。

方法2: 使用BigDecimal

double dou = 3.14789;
BigDecimal bigDecimal = new BigDecimal(dou).setScale(2, BigDecimal.ROUND_DOWN);
double newDouble = bigDecimal.doubleValue();
System.out.println("newDouble:" + newDouble);

注:

  1. BigDecimal.ROUND_UP表示四舍五入,BigDecimal.ROUND_DOWN表示直接舍弃保留位数之后的小数。
  2. 位数不够时,不会补齐。

方法3: 使用NumberFormat

double dou = 3.14789;
NumberFormat numberFormat = NumberFormat.getNumberInstance();
numberFormat.setMaximumFractionDigits(2);
numberFormat.setRoundingMode(RoundingMode.DOWN);
String douStr2 = numberFormat.format(dou);
System.out.println("douStr2:" + douStr2);

注:

  1. RoundingMode.UP表示四舍五入,RoundingMode.DOWN表示直接舍弃保留位数之后的小数。
  2. NumberFormat不指定 RoundingMode时,默认为四舍五入。
  3. 位数不够时,不会补齐。

方法4: 使用DecimalFormat

double dou = 3.14789;
DecimalFormat df = new DecimalFormat("#.00");
String formatted = df.format(dou);
System.out.println("formatted:" + formatted);

注:

  • 该方法会进行四舍五入,并且位数不够时会用0补齐。

测试代码

package com.test;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;

public class DoubleTest {

    /**
     * 保留两位小数,四舍五入的一个简单方法
     * @param d
     * @return
     */
    public static double formatDouble1(double d) {
        return (double)Math.round(d * 100) / 100;
    }
  
    /**
     * 使用BigDecimal进行保留两位小数
     * @param d
     * @return
     */
    public static double formatDouble2(double d) {
        BigDecimal bg = new BigDecimal(d).setScale(2, RoundingMode.UP);
        return bg.doubleValue();
    }

    /**
     * 使用NumberFormat进行保留两位小数
     * @param d
     * @return
     */
    public static String formatDouble3(double d) {
        NumberFormat nf = NumberFormat.getNumberInstance();
        nf.setMaximumFractionDigits(2);
        nf.setRoundingMode(RoundingMode.UP);
        return nf.format(d);
    }
  
    /**
     * 使用DecimalFormat进行保留两位小数
     * @param d
     * @return
     */
    public static String formatDouble4(double d) {
        DecimalFormat df = new DecimalFormat("#.00");
        return df.format(d);
    }
  
    /**
     * 使用String.format进行保留两位小数
     * @param d
     * @return
     */
    public static String formatDouble5(double d) {
        return String.format("%.2f", d);
    }

    public static void main(String[] args) {
        double d = 12345.67890;
      
        System.out.println(formatDouble1(d));
        System.out.println(formatDouble2(d));
        System.out.println(formatDouble3(d));
        System.out.println(formatDouble4(d));
        System.out.println(formatDouble5(d));
    }
}

输出

12345.68  
12345.68  
12,345.68  
12345.68  
12345.68

总结

以上方法各有优缺点,选择哪种方法取决于具体需求:

  • 如果需要简单的四舍五入并且输出格式化字符串,可以使用 String.formatDecimalFormat
  • 如果需要更精确的数值运算和舍入控制,建议使用 BigDecimal
  • NumberFormat适合需要国际化和 locale 支持的场景。

希望本文能帮助你更好地处理Java中的数值格式化问题。