java.math.BigDecimal的用法及加减乘除计算
作者:随波逐流baby
这篇文章主要介绍了java.math.BigDecimal的用法及加减乘除计算,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
java.math.BigDecimal及加减乘除计算
BigDecimal简介
- BigDecimal用来对需要更大或更小的数进行任意精度的运算。
- 在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。
- 尽量使用参数类型为String的构造函数。
- BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值。
BigDecimal构造方法
BigDecimal(BigInteger val)
将 BigInteger转换成 BigDecimal
BigDecimal(char[] in)
一个转换的字符数组表示 BigDecimal成 BigDecimal ,接受字符作为的相同序列 BigDecimal(String)构造
BigDecimal(double val)
将 double转换为 BigDecimal ,这是 double的二进制浮点值的精确十进制表示
BigDecimal(int val)
将 int成 BigDecimal
BigDecimal(long val)
将 long成 BigDecimal
BigDecimal(String val)
将BigDecimal的字符串表示 BigDecimal转换为 BigDecimal
BigDecimal 常用方法 加减乘除运算
BigDecimal a = new BigDecimal(6); BigDecimal b = new BigDecimal(5); a.add(b); //a+b 加 a.subtract(b); // a-b 减 a.multiply(b); // a*b 乘 a.divide(b);// a/b 除 a.doubleValue();//转换成双精度 double类型 a.floatValue(); //转换成单精度 float类型 a.longValue(); //转换成长整形 long 类型 a.intValue(); //转换成整形 int 类型 a.pow(3);//a的3次方 a.abs();//a的绝对值 a.negate();//a的负数
BigDecimal数值比较
BigDecimal a = new BigDecimal(6); int i = a.compareTo(BigDecimal.ZERO); //和0做比较 i==-1;//表示a小于0 i==0;//表示a=0 i==1;//表示a大于0 boolean b1 = a.subtract(b).compareTo(BigDecimal.ZERO) > 0;//判断a-b是否大于0
BigDecimal常见异常
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。
原因:
JAVA中如果用BigDecimal做除法的时候一定要在divide方法中传递第二个参数,定义精确到小数点后几位,否则在不整除的情况下,结果是无限循环小数时,就会抛出以上异常。
解决办法:
a.divide(b,4,RoundingMode.HALF_UP));
第二个参数是保留小数位数
第三个代表模式
模式:
ROUND_UP
始终对前一位加1 只入不舍ROUND_DOWN
始终不对小数进行改变 只舍不入ROUND_CEILING
如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。ROUND_FLOOR
如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。ROUND_HALF_UP
四舍五入ROUND_HALF_DOWN
五舍六入ROUND_HALF_EVEN
如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
心得
BigDecimal 主要用来操作(大)浮点数,BigInteger 主要用来操作大整数(超过 long 类型)。
BigDecimal 的实现利用到了 BigInteger, 所不同的是 BigDecimal 加入了小数位的概念。
java.math.BigDecimal 比较大小
BigDecimal a = new BigDecimal (101); BigDecimal b = new BigDecimal (111); //使用compareTo方法比较 //注意:a、b均不能为null,否则会报空指针 if(a.compareTo(b) == -1){ System.out.println("a小于b"); } if(a.compareTo(b) == 0){ System.out.println("a等于b"); } if(a.compareTo(b) == 1){ System.out.println("a大于b"); } if(a.compareTo(b) > -1){ System.out.println("a大于等于b"); } if(a.compareTo(b) < 1){ System.out.println("a小于等于b"); }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。