BigDecimalUtil

凛冬雪夜 / 2024-09-27 / 原文

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

public class BigDecimalUtil {

// 除法运算默认精度
private static final int DIVIDE_DEFAULT_SCALE = 10;

private BigDecimalUtil() {
}

/**
 * 加法(double)
 */
public static double add(double value1, double value2) {
    BigDecimal v1 = BigDecimal.valueOf(value1);
    BigDecimal v2 = BigDecimal.valueOf(value2);
    return v1.add(v2).doubleValue();
}

/**
 * 加法(String)
 */
public static double add(String value1, String value2) {
    BigDecimal v1 = new BigDecimal(value1);
    BigDecimal v2 = new BigDecimal(value2);
    return v1.add(v2).doubleValue();
}

/**
 * 减法(double)
 */
public static double subtract(double value1, double value2) {
    BigDecimal v1 = BigDecimal.valueOf(value1);
    BigDecimal v2 = BigDecimal.valueOf(value2);
    return v1.subtract(v2).doubleValue();
}

/**
 * 减法(String)
 */
public static double subtract(String value1, String value2) {
    BigDecimal v1 = new BigDecimal(value1);
    BigDecimal v2 = new BigDecimal(value2);
    return v1.subtract(v2).doubleValue();
}

/**
 * 乘法(double)
 */
public static double multiply(double value1, double value2) {
    BigDecimal v1 = BigDecimal.valueOf(value1);
    BigDecimal v2 = BigDecimal.valueOf(value2);
    return v1.multiply(v2).doubleValue();
}

/**
 * 乘法(String)
 */
public static double multiply(String value1, String value2) {
    BigDecimal v1 = new BigDecimal(value1);
    BigDecimal v2 = new BigDecimal(value2);
    return v1.multiply(v2).doubleValue();
}

/**
 * 除法(double)
 */
public static double divide(double value1, double value2) {
    BigDecimal v1 = BigDecimal.valueOf(value1);
    BigDecimal v2 = BigDecimal.valueOf(value2);
    return v1.divide(v2, DIVIDE_DEFAULT_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
}

/**
 * 除法(String)
 */
public static double divide(String value1, String value2) {
    BigDecimal v1 = new BigDecimal(value1);
    BigDecimal v2 = new BigDecimal(value2);
    return v1.divide(v2, DIVIDE_DEFAULT_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
}

/**
 * 比较是否相等
 */
public static boolean isEqual(BigDecimal v1, BigDecimal v2) {
    if (v1 == null || v2 == null) {
        return false;
    }
    return 0 == v1.compareTo(v2);
}

/**
 * 格式化(保留 2 位小数)
 *
 * @param value
 * @return
 */
public static String format(double value) {
    DecimalFormat df = new DecimalFormat("0.00");
    df.setRoundingMode(RoundingMode.HALF_UP);
    return df.format(value);
}

public static void main(String[] args) {
    testDecimalFormat();
}

private static void testDecimalFormat() {

    double value = 10.777;

    DecimalFormat df = new DecimalFormat();
    df.setRoundingMode(RoundingMode.HALF_UP);// 四舍五入

    // 保留 0 位小数
    df = new DecimalFormat("0");
    System.err.println(df.format(value));// 11

    // 保留 1 位小数
    df = new DecimalFormat("0.0");
    System.err.println(df.format(value));// 10.8

    // 保留 4 位小数,若小数位不足 4 位则补 0;若整数位不足 5 位,则补 0
    System.err.println(new DecimalFormat("00000.0000").format(value));// 00010.7770

    // 乘 100 -> 保留 4 位小数,若小数位不足 4 位则补 0 -> 拼接 %
    System.err.println(new DecimalFormat("0.0000%").format(value));// 1077.7000%

}