一、大数值
java.math包中的两个类
- 整数运算 BigInteger
- 浮点数运算 BigDecimal
(1)BigInteger
代码示例:
import java.math.*;
public class BigInteger {
public static void main(String[] args) {
BigInteger b1 = new BigInteger("151523165") ; // 声明BigInteger对象
BigInteger b2 = new BigInteger("2132151321") ; // 声明BigInteger对象
System.out.println("加法操作:" + b2.add(b1)) ; // 加法操作
System.out.println("减法操作:" + b2.subtract(b1)) ; // 减法操作
System.out.println("乘法操作:" + b2.multiply(b1)) ; // 乘法操作
System.out.println("除法操作:" + b2.divide(b1)) ; // 除法操作
System.out.println("最大数:" + b2.max(b1)) ; // 求出最大数
System.out.println("最小数:" + b2.min(b1)) ; // 求出最小数
BigInteger result[] = b2.divideAndRemainder(b1) ; // 求出余数的除法操作
System.out.println("商是:" + result[0] +
";余数是:" + result[1]) ;
}
}
(2) BigDecimal
对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。
2.1 四舍五入问题
首先,明确Math.round()并非为四舍五入
舍去位的数值小于5时,直接舍去。
舍去位的数值大于5时,进位后舍去。
当舍去位的数值等于5时,若5后面还有其他非0数值,则进位后舍去,若5后面是0时,则根据5前一位数的奇偶性来判断,奇数进位,偶数舍去。
11.556 = 11.56 ------六入
11.554 = 11.55 -----四舍
11.5551 = 11.56 -----五后有数进位
11.545 = 11.54 -----五后无数,若前位为偶数应舍去
11.555 = 11.56 -----五后无数,若前位为奇数应进位
2.2 利用BigDecimal四舍五入
错误举例:
double d = 8.635;
BigDecimal ds = new BigDecimal(d);
d = ds.setScale(2,RoundingMode.HALF_UP).doubleValue();
System.out.println(d); //输出结果是8.63
可以看出结果不是我们期待的值
正确代码:
double d = 8.635;
BigDecimal ds = new BigDecimal(Double.toString(d));
d = ds.setScale(2,RoundingMode.HALF_UP).doubleValue();
System.out.println(d); //输出结果是8.64
如果需要精确计算,必须要用String 来够造BigDecimal
代码示例:
import java.math.*;
public class Test8 {
public static void main(String[] args) {
System.out.println("加法运算:" + MyMath.round(MyMath.add(1.15454,1.5484545),2)) ;
System.out.println("减法运算:" + MyMath.round(MyMath.sub(884545,48545.9),3)) ;
System.out.println("乘法运算:" + MyMath.round(MyMath.mul(1245.8,886.454),4)) ;
System.out.println("除法运算:" + MyMath.div(9.345,3.333,3)) ;
System.out.println("四舍五入:"+MyMath.round(9.675, 2));
}
}
class MyMath{
public static double add(double d1,double d2){ // 进行加法计算
BigDecimal b1 = new BigDecimal(Double.toString(d1)) ;
BigDecimal b2 = new BigDecimal(Double.toString(d2)) ;
return b1.add(b2).doubleValue() ;
}
public static double sub(double d1,double d2){ // 进行减法计算
BigDecimal b1 = new BigDecimal(Double.toString(d1)) ;
BigDecimal b2 = new BigDecimal(Double.toString(d2)) ;
return b1.subtract(b2).doubleValue() ;
}
public static double mul(double d1,double d2){ // 进行乘法计算
BigDecimal b1 = new BigDecimal(Double.toString(d1)) ;
BigDecimal b2 = new BigDecimal(Double.toString(d2)) ;
return b1.multiply(b2).doubleValue() ;
}
public static double div(double d1,double d2,int len){ // 进行除法计算
if (len < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(d1)) ;
BigDecimal b2 = new BigDecimal(Double.toString(d2)) ;
return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;
}
public static double round(double d,int len){ // 进行四舍五入
if (len < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");}
BigDecimal b1 = new BigDecimal(Double.toString(d)) ;
return b1.setScale(len,BigDecimal.ROUND_HALF_UP).doubleValue() ;
}
}