java math bigdecimal_java.math.BigDecimal类

BigDecimal提供算数、标度操作、舍入、比较、哈希算法和格式转换。toString方法提供BigDecimal的规范表示形式

一、静态变量

ONE、TEN、 ZERO:指定值,并返回

ROUND_****:值从0到7的范围

二、构造函数

new BigDecimal(BigInteger unscaledVal, int scale)

BigDecimal d0 = new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_UP);

BigDecimal d1= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_DOWN);

BigDecimal d2= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_CEILING);

BigDecimal d3= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_FLOOR);

BigDecimal d4= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_HALF_UP);

BigDecimal d5= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_HALF_DOWN);

BigDecimal d6= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_HALF_EVEN);

BigDecimal d7= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_UNNECESSARY);

System.out.println(d0);//99900

System.out.println(d1);//9990.0

System.out.println(d2);//999.00

System.out.println(d3);//99.900

System.out.println(d4);//9.9900

System.out.println(d5);//0.99900

System.out.println(d6);//0.099900

System.out.println(d7);//0.0099900

new BigDecimal(double val, MathContext mc)

double d = 16.1;//d = 6.000;

BigDecimal doubleToBigDecimal= newBigDecimal(d);

BigDecimal doubleToBigDecimal_0= newBigDecimal(d, MathContext.UNLIMITED);

BigDecimal doubleToBigDecimal_7= newBigDecimal(d, MathContext.DECIMAL32);

BigDecimal doubleToBigDecimal_16= newBigDecimal(d, MathContext.DECIMAL64);

BigDecimal doubleToBigDecimal_34= newBigDecimal(d, MathContext.DECIMAL128);

System.out.println(doubleToBigDecimal);//d=6.000:6 d=16.1:16.10000000000000142108547152020037174224853515625

System.out.println(doubleToBigDecimal_0); //d=6.000:6 d=16.1:和上述一样,16.10000000000000142108547152020037174224853515625

System.out.println(doubleToBigDecimal_7); //d=6.000:6 d=6.1:保留7位数,包含小数和整数

System.out.println(doubleToBigDecimal_16); //d=6.000:6 d=6.1:保留16位数,包含小数和整数

System.out.println(doubleToBigDecimal_34); //d=6.000:6 d=6.1:保留34位数,包含小数和整数

new BigDecimal(longval, MathContext mc)

Long l = 10091L;

l= 100900L;

BigDecimal longToBigDecimal= newBigDecimal(l);

BigDecimal longToBigDecimal_0= newBigDecimal(l, MathContext.UNLIMITED);

BigDecimal longToBigDecimal_7= newBigDecimal(l, MathContext.DECIMAL32);

BigDecimal longToBigDecimal_16= newBigDecimal(l, MathContext.DECIMAL64);

BigDecimal longToBigDecimal_34= newBigDecimal(l, MathContext.DECIMAL128);

System.out.println(longToBigDecimal);//100901 ; 100900

System.out.println(longToBigDecimal_0); //100901 ; 100900

System.out.println(longToBigDecimal_7); //100901 ; 100900

System.out.println(longToBigDecimal_16);//100901 ; 100900

System.out.println(longToBigDecimal_34);//100901 ; 100900

new BigDecimal(String val, MathContext mc)

String str = "187";

str= "187.9";

BigDecimal strToBigDecimal= newBigDecimal(str);

BigDecimal strToBigDecimal_0= newBigDecimal(str, MathContext.UNLIMITED);

BigDecimal strToBigDecimal_7= newBigDecimal(str, MathContext.DECIMAL32);

BigDecimal strToBigDecimal_16= newBigDecimal(str, MathContext.DECIMAL64);

BigDecimal strToBigDecimal_34= newBigDecimal(str, MathContext.DECIMAL128);

System.out.println(strToBigDecimal);//187 ; 187.9

System.out.println(strToBigDecimal_0); //187 ; 187.9

System.out.println(strToBigDecimal_7); //187 ; 187.9

System.out.println(strToBigDecimal_16); //187 ; 187.9

System.out.println(strToBigDecimal_34); //187 ; 187.9

三、常用方法

add(BigDecimal val)

subtract(BigDecimal val)

myltiply(BigDecimal val)

divide(BigDecimal val, RoundingMode mode)

a.divide(b,2);//2为精度取值

注意以下相除会抛出异常,原因: 通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常

//BigDecimal divideBg = a.divide(b);

//解决方法是:设置精确度;就是给divide设置精确的小数点

divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN)

//其中的第二个参数表示的是:保留小数点之后多少位

除法的详细说明

divide(BigDecimal divisor, int scale, introundingMode)

BigDecimal的setScale方法

用于格式化小数点

setScale(1):表示保留一位小数,默认用四舍五入的方式;

setScale(1, BigDecimal.ROUND_DOWN):直接删除多余的小数位,如2.35会变成2.3

setScale(1, BigDecimal.ROUND_UP):进位处理,2.35变成2.4

setScale(1,BigDecimal.ROUND_HALF_UP):四舍五入,2.35变成2.4

setScaler(1,BigDecimal.ROUND_HALF_DOWN):四舍五入,2.35变成2.3,如果是5则向下舍入

注意点一:scale指的就是你小数点后的位数;scale()就是BigDecimal类中的方法,b.scale()返回b小数点后的位数

注意点二:roundingMode是小数的保留模式。他们都是BigDecimal中的常量字段,如:BigDecimal.ROUND_HALF_UP表示的就是四舍五入

注意点三:divide(BigDecimal divisor, int scale, int roundingMode)的意思是说: 我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式是什么,是四舍五入啊还是其它的

compareTo()

compareTo()方法用来比较两个值的大小,返回值为0、-1、1( -1 小于   0 等于    1 大于)

取其中最大、最小值、绝对值、相反数

a.max (b) //比较取最大值

a.min(b) //比较取最小值

a.abs()//取最绝对值

a.negate()//取相反数

四、舍入模式常量解释

ROUND_CEILING:向正无限大方向舍入的舍入模式

ROUND_DOWN:向零方向舍入的舍入模式

ROUND_FLOOR:向负无限大方向舍入的舍入模式

ROUND_HALF_DOWN:向最接近数字方向舍入的舍入模式,如果与两个响铃数字的距离相等,则向下舍入

ROUND_HALF_EVEN:向最接近你数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向响铃的偶数舍入

ROUND_HALF_UP:向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入

ROUND_UNNECESSARY:用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入

ROUND_UP:远离零方向舍入的舍入模式

五、关于BigDecimal格式化

publicString formatValue(Object value){

String content= null;if (value == null) {

content= "";

}else{if(value instanceofBigDecimal){//conver to fortmat String

NumberFormat nf =NumberFormat.getInstance();

nf.setMinimumFractionDigits(2);

nf.setMaximumFractionDigits(2);

content=nf.format(value);

}else{

content=String.valueOf(value);

}

}returncontent;

}

使用这样一个方法可以达到格式化的效果,下面的setMaximumFractionDigits

表示小数点后面的精确位数。

NumberFormat的货币格式:

getCurrencyInstance(): 返回当前默认环境的货币格式

getCurrencyInstance(Local local):返回指定货币格式的nubmber对象

f09480fbdaa2dd6bf92acdf1ef0fda95.png

String str = "187";

str= "187.9";

BigDecimal strToBigDecimal= newBigDecimal(str);

BigDecimal strToBigDecimal_0= newBigDecimal(str, MathContext.UNLIMITED);

BigDecimal strToBigDecimal_7= newBigDecimal(str, MathContext.DECIMAL32);

BigDecimal strToBigDecimal_16= newBigDecimal(str, MathContext.DECIMAL64);

BigDecimal strToBigDecimal_34= newBigDecimal(str, MathContext.DECIMAL128);

System.out.println(strToBigDecimal);//187 ; 187.9

System.out.println(strToBigDecimal_0); //187 ; 187.9

System.out.println(strToBigDecimal_7); //187 ; 187.9

System.out.println(strToBigDecimal_16); //187 ; 187.9

System.out.println(strToBigDecimal_34); //187 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值