bigdecimal加减(bigdecimal加减运算)
java中BigDecimal 的加减乘除和“+”“-”“*”“/”有什么区别
BigDecimal用作商业计算的。
BigDecimal aDouble =new BigDecimal(1.22);? ? ?输出:1.2199999999999999733546474089962430298328399658203125
BigDecimal aString = new BigDecimal("1.22");? ?输出:1.22
以上两者输出结果是不一样的。
原因:
double的构造方法有不可预知性。
String的构造方法是固定的值。
所以如果类型是Double的话,而且需要精确计算,就用下面方法:
Double.toString(double)方法,可以先转为String,然后再用new BigDecimal("")构造方法。
注意:BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值
Demo测试
????public?static?final?void?main(String[]?args)?{
????????BigDecimal?aBigDecimal?=?new?BigDecimal("1.1");
????????BigDecimal?bBigDecimal?=?new?BigDecimal("2.0");
????????
????????BigDecimal?subtract?=?bBigDecimal.subtract(aBigDecimal);
????????System.out.println("使用BigDecimal进行相减计算:"?+?subtract.doubleValue());
????????System.out.println("直接相减:?"?+?(2.0?-?1.1));
结果:
使用BigDecimal进行相减计算:0.9
直接相减:?0.8999999999999999
如何利用Java中的BigDecimal实现加减乘除功能
仅做参考:
import?java.math.BigDecimal;???
/**??
*?由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精??
*?确的浮点数运算,包括加减乘除和四舍五入。??
*/??
public?class?Arith{?//默认除法运算精度???
private?static?final?int?DEF_DIV_SCALE?=?10;?//这个类不能实例化???
private?Arith(){???
}???
/**??
*?提供精确的加法运算。??
*?@param?v1?被加数??
*?@param?v2?加数??
*?@return?两个参数的和??
*/??
public?static?double?add(double?v1,double?v2){???
BigDecimal?b1?=?new?BigDecimal(Double.toString(v1));???
BigDecimal?b2?=?new?BigDecimal(Double.toString(v2));???
return?b1.add(b2).doubleValue();???
}???
/**??
*?提供精确的减法运算。??
*?@param?v1?被减数??
*?@param?v2?减数??
*?@return?两个参数的差??
*/??
public?static?double?sub(double?v1,double?v2){???
BigDecimal?b1?=?new?BigDecimal(Double.toString(v1));???
BigDecimal?b2?=?new?BigDecimal(Double.toString(v2));???
return?b1.subtract(b2).doubleValue();???
}???
/**??
*?提供精确的乘法运算。??
*?@param?v1?被乘数??
*?@param?v2?乘数??
*?@return?两个参数的积??
*/??
public?static?double?mul(double?v1,double?v2){???
BigDecimal?b1?=?new?BigDecimal(Double.toString(v1));???
BigDecimal?b2?=?new?BigDecimal(Double.toString(v2));???
return?b1.multiply(b2).doubleValue();???
}???
/**??
*?提供(相对)精确的除法运算,当发生除不尽的情况时,精确到??
*?小数点以后10位,以后的数字四舍五入。??
*?@param?v1?被除数??
*?@param?v2?除数??
*?@return?两个参数的商??
*/??
public?static?double?div(double?v1,double?v2){???
return?div(v1,v2,DEF_DIV_SCALE);???
}???
/**??
*?提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指??
*?定精度,以后的数字四舍五入。??
*?@param?v1?被除数??
*?@param?v2?除数??
*?@param?scale?表示表示需要精确到小数点以后几位。??
*?@return?两个参数的商??
*/??
public?static?double?div(double?v1,double?v2,int?scale){???
if(scale0){???
throw?new?IllegalArgumentException(???
"The?scale?must?be?a?positive?integer?or?zero");???
}???
BigDecimal?b1?=?new?BigDecimal(Double.toString(v1));???
BigDecimal?b2?=?new?BigDecimal(Double.toString(v2));???
return?b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();???
}???
/**??
*?提供精确的小数位四舍五入处理。??
*?@param?v?需要四舍五入的数字??
*?@param?scale?小数点后保留几位??
*?@return?四舍五入后的结果??
*/??
public?static?double?round(double?v,int?scale){???
if(scale0){???
throw?new?IllegalArgumentException("The?scale?must?be?a?positive?integer?or?zero");???
}???
BigDecimal?b?=?new?BigDecimal(Double.toString(v));???
BigDecimal?one?=?new?BigDecimal("1");???
return?b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();???
}???
};
java中bigdecimal 类型的变量怎么相互加减乘除
如图
import?java.math.BigDecimal;
public?class?Test?{
????public?static?void?main(String[]?args)?{
????????//?BigDecimal是处理double精度问题的对象
????????BigDecimal?b1?=?new?BigDecimal("10");
????????BigDecimal?b2?=?new?BigDecimal("10");
????????//?结果
????????BigDecimal?result?=?null;
????????//?加
????????result?=?b1.add(b2);
????????System.out.println(result.doubleValue());
????????//?减
????????result?=?b1.subtract(b2);
????????System.out.println(result.doubleValue());
????????//?乘
????????result?=?b1.multiply(b2);
????????System.out.println(result.doubleValue());
????????//?除
????????result?=?b1.divide(b2);
????????System.out.println(result.doubleValue());
????}
}
20.0
0.0
100.0
1.0
bigdecimal加减乘除有哪些?
//BigDecimal add = ma.add(mb),System.out.println("加法:"+add)。BigDecimal sub =ma.subtract(mb),System.out.println("减法:"+sub)。
使用BigDecimal要用String来够造,要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。
需要注意的是除法运算divide:
BigDecimal除法可能出现不能整除的情况,比如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。
其实divide方法有可以传三个参数:public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) 第一参数表示除数, 第二个参数表示小数点后保留位数,第三个参数表示舍入模式,只有在作除法运算或四舍五入时才用到舍入模式。
bigdecimal加减乘除是什么?
bigdecimal加减乘除如下:
1、//?加:
(1)BigDecimal?add?=?ma.add(mb)
(2)System.out.println("加法:"+add)
2、//?减:
(1)BigDecimal?sub?=?ma.subtract(mb)
(2)System.out.println("减法:"+sub)
3、//?乘:
(1)BigDecimal?mul?=?mb.multiply(md)
(2)System.out.println("乘法:"+mul)
4、//?除:
(1)BigDecimal?div?=?mb.divide(md)
(2)System.out.println("除法:"+div)
BigDecimal一共有4个构造方法:
BigDecimal(int) 创建一个具有参数所指定整数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。(不建议采用)
BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。