BigDecimal⽤法详解及其四舍五⼊问题
BigDecimal⽤法详解及其四舍五⼊问题
⼀、简介
Java在java.math包中提供的API类BigDecimal,⽤来对超过16位有效位的数进⾏精确的运算。双精度浮点型变量double 可以处理16位有效数。在实际应⽤中,需要对更⼤或者更⼩的数进⾏运算和处理。float和double只能⽤来做科学计算或者是⼯程计算,在商业计算中要⽤java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使⽤传统的+、-、*、/等算术运算符直接对其对象进⾏数学运算,⽽必须调⽤其相对应的⽅法。⽅法中的参数也必须是BigDecimal的对象。构造器是类的特殊⽅法,专门⽤来创建对象,特别是带有参数的对象。
⼆、构造器描述
BigDecimal(int) 创建⼀个具有参数所指定整数值的对象。
BigDecimal(double) 创建⼀个具有参数所指定双精度值的对象。
BigDecimal(long) 创建⼀个具有参数所指定长整数值的对象。
BigDecimal(String) 创建⼀个具有参数所指定以字符串表⽰的数值的对象。
三、⽅法描述
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。
四.下⾯我写⼀个⼯具类⽅便⼤家理解
public class CaculateBigDecimal {
/**
* @param addOne
* @param addTwo
* @return ⾼精度的加法运算
*/
public static double bigDecimalAdd(double addOne ,double addTwo){
//创建BigDecimal对象
BigDecimal b1=new BigDecimal(addOne);
BigDecimal b2=new BigDecimal(addTwo);
return b1.add(b2).doubleValue();
}
/**
/**
* @param subOne
* @param subTwo
* @return ⾼精度运算减法
*/
public static double bigDecimalSub(double subOne,double subTwo){
BigDecimal b1=new BigDecimal(subOne);
BigDecimal b2=new BigDecimal(subTwo);
return b1.subtract(b2).doubleValue();
}
/**
* @param mulOne
* @param mulTwo
* @return ⾼精度的乘法
*/
public static double bigDecimalMul(double mulOne,double mulTwo){
BigDecimal b1=new BigDecimal(mulOne);
BigDecimal b2=new BigDecimal(mulTwo);
return b1.multiply(b2).doubleValue();
}
/**
* @param divOne
* @param divTwo
* @return ⾼精度除法
*/
public static double bigDecimalDiv(double divOne,double divTwo){
BigDecimal b1=new BigDecimal(divOne);
BigDecimal b2=new BigDecimal(divTwo);
return b1.divide(b2).doubleValue();//这⾥可以设置保留精度,保留位数下⾯我们在细细介绍。
}
/
**
* @param roundDate
* @param length 保留⼩数后的位数
* @return 返回四舍五⼊后的参数
*/
public static double bigDecimalRound(double roundDate,int length){
BigDecimal b1=new BigDecimal(roundDate);
BigDecimal b2=new BigDecimal(1);
//第三个参数是表⽰四舍五⼊操作,这⾥传⼊的参数需要时字符串,不然可能不对下⾯我在介绍。
return b1.divide(b2, length, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/
**
* @param roundDate
* @param length
* @return 返回四舍五⼊后的参数
*/
public static double bigDecimalStringRound(String roundDate,int length){
BigDecimal b1=new BigDecimal(roundDate);
BigDecimal b2=new BigDecimal(1);
return b1.divide(b2, length, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
五.常见问题及其相关介绍
public BigDecimal(double val)将 double 转换为 BigDecimal,后者是 double 的⼆进制浮点值准确的⼗进制表⽰
形式。返回的 BigDecimal 的标度是使 (10scale × val) 为整数的最⼩值。
注:
此构造⽅法的结果有⼀定的不可预知性。有⼈可能认为在 Java 中写⼊ new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(⾮标度值 1,其标度为 1),但是它实际上等于
0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 ⽆法准确地表⽰为 double(或者说对于该情况,不能表⽰为任何有限长度的⼆进制⼩数)。这样,传⼊ 到构造⽅法的值不会正好等于
0.1(虽然表⾯上等于该值)。
另⼀⽅⾯,String 构造⽅法是完全可预知的:写⼊ new BigDecimal("0.1") 将创建⼀个 BigDecimal,它正好 等于
预期的 0.1。因此,⽐较⽽⾔,通常建议优先使⽤ String 构造⽅法。
当 double 必须⽤作 BigDecimal 的源时,请注意,此构造⽅法提供了⼀个准确转换;它不提供与以下操作相同的结
果:先使⽤ String(double) ⽅法,然后使⽤ BigDecimal(String) 构造⽅法,将 double 转换为 String。要获取该结果,请使⽤ static valueOf(double) ⽅法。
六.四舍五⼊的配置参数介绍
BigDecimal.setScale()⽅法⽤于格式化⼩数点
setScale(1)表⽰保留⼀位⼩数,默认⽤四舍五⼊⽅式bigdecimal除法保留小数
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则向下舍
注释:
1:scale指的是你⼩数点后的位数。⽐如123.456则score就是3.
score()就是BigDecimal类中的⽅法啊。
⽐如:BigDecimal b = new BigDecimal("123.456");
b.scale(),返回的就是3.
2:
roundingMode是⼩数的保留模式。它们都是BigDecimal中的常量字段,有很多种。
⽐如:BigDecimal.ROUND_HALF_UP表⽰的就是4舍5⼊。
3:
pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
的意思是说:我⽤⼀个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个⼩数位,roundingMode表⽰的就 4:对于⼀般add、subtract、multiply⽅法的⼩数位格式化如下:
BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("mData=" + mData);
----结果:----- mData=9.66
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论