概述
一、Java使用BigDecimal公式计算(精确计算)
介绍:
使用BigDecimal加减乘除方法运算,可以使用BigDecimal类提供的add、subtract、multiply、divide方法函数实现。
公式加法计算~add
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(5.6);
BigDecimal b = BigDecimal.valueOf(2.1);
//BigDecimal计算add
BigDecimal addResult = a.add(b);
System.out.println("结果集: " +addResult);
}
结果集:
公式减法计算~subtract
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(5.6);
BigDecimal b = BigDecimal.valueOf(2.1);
BigDecimal计算subtract
BigDecimal subtract = a.subtract(b);
System.out.println("结果集subtract: " +subtract);
}
结果集:
公式乘法计算~multiply
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(5.6);
BigDecimal b = BigDecimal.valueOf(2.1);
BigDecimal计算multiply
BigDecimal multiply = a.multiply(b);
System.out.println("结果集: " +multiply);
}
结果集:
公式除法计算~divide
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(5.6);
BigDecimal b = BigDecimal.valueOf(2.1);
//BigDecimal计算divide
//ROUND_HALF_UP:向“最接近的”整数舍入。 若舍入位大于等于5,则对舍入部分的前一位数字加1;若舍入位小于5,则直接舍弃。即为四舍五入模式。
BigDecimal divide = a.divide(b,2,BigDecimal.ROUND_HALF_UP);//四舍五入,保留两位小数.
System.out.println("结果集: " +divide);
}
结果集:
二、 BigDecimal(舍入模式)选择
简介:
BigDecimal.setScale主要用于对BigDecimal数据小数点后的位数进行 进位、舍位、截断等操作
java.math.RoundingMode:这是一种枚举类型,它定义了8种数据的舍入模式。它与java.math.BigDecimal类中定义的8个同名静态常量的作用相同,可用BigDecimal.setScale(int newScale, RoundingMode roundingMode)来设置数据的精度和舍入模式。
1、ROUND_UP:向远离零的方向舍入。
若舍入位为非零,则对舍入部分的前一位数字加1;若舍入位为零,则直接舍弃。即为向外取整模式。
2、ROUND_DOWN:向接近零的方向舍入。
不论舍入位是否为零,都直接舍弃。即为向内取整模式。
3、ROUND_CEILING:向正无穷大的方向舍入。
若 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;若为负,则舍入行为与 ROUND_DOWN 相同。即为向上取整模式。
4、ROUND_FLOOR:向负无穷大的方向舍入。
若 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;若为负,则舍入行为与 ROUND_UP 相同。即为向下取整模式。
5、ROUND_HALF_UP:向“最接近的”整数舍入。
若舍入位大于等于5,则对舍入部分的前一位数字加1;若舍入位小于5,则直接舍弃。即为四舍五入模式。
6、ROUND_HALF_DOWN:向“最接近的”整数舍入。
若舍入位大于5,则对舍入部分的前一位数字加1;若舍入位小于等于5,则直接舍弃。即为五舍六入模式。
7、ROUND_HALF_EVEN:向“最接近的”整数舍入。
若(舍入位大于5)或者(舍入位等于5且前一位为奇数),则对舍入部分的前一位数字加1;
若(舍入位小于5)或者(舍入位等于5且前一位为偶数),则直接舍弃。即为银行家舍入模式。
8、ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。
如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。
案例:
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(5.6);
BigDecimal b = BigDecimal.valueOf(2.1);
//BigDecimal计算divide
//ROUND_HALF_UP:向“最接近的”整数舍入。 若舍入位大于等于5,则对舍入部分的前一位数字加1;若舍入位小于5,则直接舍弃。即为四舍五入模式。
//ROUND_UP:向远离零的方向舍入。 若舍入位为非零,则对舍入部分的前一位数字加1;若舍入位为零,则直接舍弃。即为向外取整模式。
BigDecimal divide = a.divide(b,BigDecimal.ROUND_HALF_UP, 2).setScale(2,ROUND_UP);
System.out.println("结果集: " +divide);
}
结果集:
计算器结果集如下图:
三、 BigDecimal.setScale用法案例
BigDecimal.setScale主要用于对BigDecimal数据小数点后的位数进行 进位、舍位、截断等操作
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(5.6);
BigDecimal b = BigDecimal.valueOf(2.1);
//BigDecimal计算divide
BigDecimal divide = a.divide(b,2,BigDecimal.ROUND_UP).setScale(2, BigDecimal.ROUND_UP);
System.out.println("结果集: " +divide);
}
结果集:
四、Java使用BigDecimal精度丢失问题
介绍:
在实际应用中,经常会使用到计算,举例如 '银行' 特别是在我们交易的时候,计算结果要求的更加精确,这个时候我们就会使用到java.math包中提供的API类BigDecimal,用于对超过16位有效位数的数字进行精确的计算。
以如下代码为例:
public static void main(String[] args){
System.out.println("复现精度丢失:"+new BigDecimal(234.97));
}
运行后结果集出现精度丢失:
结果可以看出使用new BigDecimal(234.97),传入参数为double类型发生精度丢失,运行的结果并不等于234.97,而是为234.969999999999998863131622783839702606201171875。
原因是double不能表示为任何有限长度的二进制小数;
解决方法:
使用new BigDecimal(String)构造函数,创建一个参数以字符串表示数值的对象
public static void main(String[] args){
double a = 234.97;
String b = "234.97";
// 方式一:double的封装类Double中的toString()方法解决
System.out.println("使用bigDecimal进行转换" + new BigDecimal(new Double(a).toString()));
// 方式二:使用String接收数值
System.out.println("使用bigDecimal进行转换" + new BigDecimal(b));
}
结果集如下:
注意: String、int 不会丢失精度,将double,float转成String再计算也可以避免精度丢失问题。
解决案例:
public static void main(String[] args){
BigDecimal a = new BigDecimal(234.97);
//复现精度丢失
System.out.println("精度丢失: "+a);
//进行转换
System.out.println("使用bigDecimal进行转换: " + BigDecimal.valueOf(new Double(String.valueOf(a))).toString());
}
结果:
解决案例:
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(234.97);
//解决精度丢失
System.out.println("解决精度不丢失: "+a);
//进行转换
System.out.println("使用bigDecimal进行转换: " + BigDecimal.valueOf(new Double(String.valueOf(a))).toString());
}
结果:
注意 : 结果看并没丢失,原因是这样定义的 BigDecimal.valueOf(234.97);
总结: BigDecimal.valueof(234.97) 等同于new BigDecimal("234.97") 结果是一样的 注意(new BigDecimal("234.97"))这里是有" "号的。
最后
以上就是外向乌龟为你收集整理的BigDecimal(公式精确计算)+(精度丢失问题)一、Java使用BigDecimal公式计算(精确计算)二、 BigDecimal(舍入模式)选择三、 BigDecimal.setScale用法案例四、Java使用BigDecimal精度丢失问题的全部内容,希望文章能够帮你解决BigDecimal(公式精确计算)+(精度丢失问题)一、Java使用BigDecimal公式计算(精确计算)二、 BigDecimal(舍入模式)选择三、 BigDecimal.setScale用法案例四、Java使用BigDecimal精度丢失问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复