商业计算——BigDecimal

BigDecimal表示不可变的、任意精度的有符号十进制数,由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。所表示数字如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是 (unscaledValue × 10-scale)。
另外,BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。toString() 方法提供 BigDecimal 的规范表示形式。
public class BigDecimalNewUtil {

public static void main(String[] args){

String val1 = "12.36547";
String val2 = "1587.235";

/*
* 加法1
*
* MathContext有两个属性:
* precision:指定数字的有效位数。如1.256E+2,表示有效位数4位
* RoundingMode:指定在将数字转为有效位数时采用的舍入模式
*/
MathContext mctx = new MathContext(2, RoundingMode.HALF_UP);
System.out.println("---- add method using MathContext:" + add(val1, val2, mctx));

int scale = 3;
//在java 1.5之前,使用BigDecimal.roundingMode属性指定,如: int roundingMode = BigDecimal.ROUND_HALF_UP;
RoundingMode roundingMode = RoundingMode.HALF_UP;

//加法2
System.out.println("---- add method using scale and RoundingMode:" + add(val1, val2, scale, roundingMode));

//除法
System.out.println("---- divide method using scale and RoundingMode:" + divide(val1, val2, scale, roundingMode));

//舍入1
System.out.println("---- round method using scale and RoundingMode:" + round(Double.parseDouble(val1), scale, roundingMode));

/*
* 舍入2
* BigDecimal提供直接舍入方法,其结果与我们使用round()方法相同
*/
BigDecimal bval = new BigDecimal(val1);
System.out.println("---- round method using BigDeciaml.setScale:" + bval.setScale(scale, roundingMode));


/*----------------------运行结果如下--------------------
*---- add method using MathContext:1.6E+3
*---- add method using scale and RoundingMode:1599.6
*---- divide method using scale and RoundingMode:0.0080
*---- round method using scale and RoundingMode:12.365
*---- round method using BigDeciaml.setScale:12.365
*/
}

/**
* 提供精确的加法运算
* @param val1 被加数
* @param val2 加数
* @return 和
*/
public static double add(String val1, String val2){
BigDecimal bval1= new BigDecimal(val1);
BigDecimal bval2 = new BigDecimal(val2);
return bval1.add(bval2).doubleValue();
}

/**
* 提供带舍入模式的加法运算
* @param val1 被加数
* @param val2 加数
* @param scale 舍入精度
* @param roundingMode 舍入模式
* @return 舍入和
*/
public static double add(String val1, String val2, int scale, RoundingMode roundingMode){
BigDecimal bval1= new BigDecimal(val1);
BigDecimal bval2 = new BigDecimal(val2);
double val = bval1.add(bval2).doubleValue();
return round(val, scale, roundingMode);
}

/**
* 提供指定和有效数字的加法运算
* @param val1 被加数
* @param val2 加数
* @param mctx 指定和有效数字及舍入模式的context
* @return 舍入和
*/
public static String add(String val1, String val2, MathContext mctx){
BigDecimal bval1= new BigDecimal(val1);
BigDecimal bval2 = new BigDecimal(val2);
return bval1.add(bval2, mctx).toString();
}

/**
* 提供精确的减法运算
* @param val1 被减数
* @param val2 减数
* @return 差
*/
public static double subtract(String val1, String val2){
BigDecimal bval1 = new BigDecimal(val1);
BigDecimal bval2 = new BigDecimal(val2);
return bval1.subtract(bval2).doubleValue();
}

/**
* 提供舍入的减法运算
* @param val1 被减数
* @param val2 减数
* @param scale 舍入精度
* @param roundingMode 舍入模式
* @return 舍入差
*/
public static double subtract(String val1, String val2, int scale, RoundingMode roundingMode){
BigDecimal bval1 = new BigDecimal(val1);
BigDecimal bval2 = new BigDecimal(val2);
double val = bval1.subtract(bval2).doubleValue();
return round(val, scale, roundingMode);
}

/**
* 提供精确的乘法运算
* @param val1 被乘数
* @param val2 乘数
* @return 积
*/
public static double multiply(String val1, String val2){
BigDecimal bval1 = new BigDecimal(val1);
BigDecimal bval2 = new BigDecimal(val2);
return bval1.multiply(bval2).doubleValue();
}

/**
* 提供舍入的乘法运算
* @param val1 被乘数
* @param val2 乘数
* @param scale 舍入精度
* @param roundingMode 舍入模式
* @return 舍入积
*/
public static double multiply(String val1, String val2, int scale, RoundingMode roundingMode){
BigDecimal bval1 = new BigDecimal(val1);
BigDecimal bval2 = new BigDecimal(val2);
double val = bval1.multiply(bval2).doubleValue();
return round(val, scale, roundingMode);
}

/**
* 提供带指定精度的除法
* @param val1 被除数
* @param val2 除数
* @param scale 舍入精度
* @param roundingMode 舍入模式
* @return 舍入商
*/
public static double divide(String val1, String val2, int scale, RoundingMode roundingMode){
if(scale < 0){
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal bval1= new BigDecimal(val1);
BigDecimal bval2 = new BigDecimal(val2);
return bval1.divide(bval2, scale, roundingMode).doubleValue();
}

/**
* 提供精确的小数位舍入处理
* @param val 需要舍入的数字
* @param scale 小数点后保留几位
* @param roundingMode 舍入模式
* @return 舍入后的结果
*/
public static double round(double val, int scale, RoundingMode roundingMode){
return divide(String.valueOf(val), "1", scale, roundingMode);
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值