Java BigDecimal使用

2022-08-16  本文已影响0人  Tinyspot

1. double 示例

double d1 = 1.0;
double d2 = 0.9;
// 0.09999999999999998
double value = d1 - d2;

// 0.9999999999999999
double result = (1.4 - 0.5) / 0.9;

double 是近似值存储,若需要进行高精度计算,采用 BigDecimal

2. BigDecimal

作用:精确计算浮点数,常用于财务计算;

一般采用参数为字符串的构造方法,因为字符串是最准确的

public class BigDecimal extends Number implements Comparable<BigDecimal> {
    private final BigInteger intVal;
    private final int scale; 

    // 指定以字符串表示数值
    public BigDecimal(String val) {
        this(val.toCharArray(), 0, val.length());
    }

    public BigDecimal add(BigDecimal augend) {}
    public BigDecimal subtract(BigDecimal subtrahend) {}
    public BigDecimal multiply(BigDecimal multiplicand) {}
    /**
     * scale 小数位
     * roundingModel 小数位舍入模式
     */
    public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {}

    // Returns: -1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.
    public int compareTo(BigDecimal val) {}
}

2.1 四则运算

BigDecimal b1 = new BigDecimal("1.0");
BigDecimal b2 = new BigDecimal("0.9");
BigDecimal subtract = b1.subtract(b2);
BigDecimal add = b1.add(b2);
BigDecimal multiply = b1.multiply(b2);

// 链式写法
BigDecimal divide1 = b1.add(b2).divide(new BigDecimal("0.2"));
System.out.println(divide1);

2.2 除法操作

BigDecimal divide = new BigDecimal("10").divide(new BigDecimal("3"));
注意:除不尽时会报错 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

解法:设置保留的小数位 scale 参数 divide(BigDecimal divisor, int scale, int roundingMode)

BigDecimal value = new BigDecimal("3");
BigDecimal divide2 = new BigDecimal("10").divide(value, 2, BigDecimal.ROUND_HALF_UP);

2.3 小数位

获取小数位

BigDecimal value = new BigDecimal("123.45");
int scale = value.scale(); // 2 位小数

小数位舍入模式

// 直接舍去
public final static int ROUND_UP = 0;
public final static int ROUND_DOWN = 1;
// 四舍五入
public final static int ROUND_HALF_UP = 4;

2.4 比较

    BigDecimal d1 = new BigDecimal("123.0");
    BigDecimal d2 = new BigDecimal("123.00");
    boolean equals = d1.equals(d2); // false, equals() 还会比较小数位scale
    int result = d1.compareTo(d2); // 0

3. BigDecimal.valueOf() 与 new BigDecimal(distance)

When @Overrides of synchronized methods are not themselves synchronized, the result can be improper synchronization as callers rely on the thread-safety promised by the parent class.

上一篇 下一篇

猜你喜欢

热点阅读