Java中除了有简单的计算运算符进行计算之外,还提供了Math、BigInteger、BigDecimal等类来进行复杂的数学计算,例如进行三角函数计算、平方根、幂等运算。
Math类
介绍
Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。和String类一样都是用final修饰,所以不能有子类,还有就是它的构造方法是私有的,也就是我们不能通过new的方法在其它类中构造Math对象,那么我们怎样调用它的方法,原来它的所有的方法都是静态方法,也就是可以直接使用类名就可以访问方法了。
使用
具体的使用见下面代码,详细的api查看文档查看Math类的api
public static void main(String[] args)
{
float num1 = 28.3f;
float num2 = 28.7f;
System.out.println("Math.ceil(double a)返回大于或等于 a 的最小整数值:");
System.out.println(Math.ceil(num1));
System.out.println(Math.ceil(num2));
System.out.println("\nMath.floor(double a)返回小于或等于 a 的最大整数值:");
System.out.println(Math.floor(num1));
System.out.println(Math.floor(num2));
System.out.println("\nMath.round(float a)返回指定数字的取整值:");
System.out.println(Math.round(num1));
System.out.println(Math.round(num2));
}
Math包
提供用于执行任意精度整数运算( BigInteger )和任意精度十进制算术( BigDecimal )的类。 BigInteger类似于原始整数类型,除了它提供任意精度,因此BigInteger的操作不会溢出或丢失精度。 除标准算术运算外, BigInteger还提供模运算,GCD计算,素数测试,素数生成,位操作以及一些其他杂项操作。 BigDecimal提供适用于货币计算等的任意精度有符号十进制数。 BigDecimal使用户可以完全控制舍入行为,允许用户从一组全面的八种舍入模式中进行选择。
BigInteger
BigInteger是java.math包提供的处理大整数类型,实现了大整数的存储,四则运算,判断素数的方法,求幂,求模,求逆元,求最大公约数等方法。点击查看BigInteger 的api
BigIngeter类的目的——实现高精度数的存储和计算。基础的实现机理——用int型(32位)数组存储数据。
BigInteger 的使用
BigInteger 是一个Java类,通过构造方法获取对象,通过对象来调用方法。
public static void main(String[] args) {
// create 3 BigInteger objects
BigInteger bi1, bi2, bi3;
// create 3 int objects
int i1, i2, i3;
bi1 = new BigInteger("0");
bi2 = new BigInteger("10");
bi3 = new BigInteger("-10");
// assign signum results of bi1, bi2, bi3 to i1, i2, i3
i1 = bi1.signum();
i2 = bi2.signum();
i3 = bi3.signum();
String str1 = "Signum function returns " + i1 + " for " +bi1;
String str2 = "Signum function returns " + i2 + " for " +bi2;
String str3 = "Signum function returns " + i3 + " for " +bi3;
// print i1, i2, i3 values
System.out.println( str1 );
System.out.println( str2 );
System.out.println( str3 );
}
BigDecimal
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。点击查看BigDecimalapi
BigDecimal的使用
可以使用DecimalFormat 来进行格式化
public static void main(String[] s){
System.out.println(formatToNumber(new BigDecimal("3.435")));
System.out.println(formatToNumber(new BigDecimal(0)));
System.out.println(formatToNumber(new BigDecimal("0.00")));
System.out.println(formatToNumber(new BigDecimal("0.001")));
System.out.println(formatToNumber(new BigDecimal("0.006")));
System.out.println(formatToNumber(new BigDecimal("0.206")));
}
/**
* @desc 1.0~1之间的BigDecimal小数,格式化后失去前面的0,则前面直接加上0。
* 2.传入的参数等于0,则直接返回字符串"0.00"
* 3.大于1的小数,直接格式化返回字符串
* @param obj传入的小数
* @return
*/
public static String formatToNumber(BigDecimal obj) {
DecimalFormat df = new DecimalFormat("#.00");
if(obj.compareTo(BigDecimal.ZERO)==0) {
return "0.00";
}else if(obj.compareTo(BigDecimal.ZERO)>0&&obj.compareTo(new BigDecimal(1))<0){
return "0"+df.format(obj).toString();
}else {
return df.format(obj).toString();
}
}
常见异常
在进行除法的时候可能会出现无限不循环小数,这时候会报异常(java.lang.ArithmeticException)
解决办法:设置精度(divide方法设置精确的小数点,如:divide(xxxxx,2))
简单的加减乘除的方法使用
代码案例如下:
BigDecimal bignum1 = new BigDecimal("10");
BigDecimal bignum2 = new BigDecimal("5");
BigDecimal bignum3 = null;
//加法
bignum3 = bignum1.add(bignum2);
System.out.println("和 是:" + bignum3);
//减法
bignum3 = bignum1.subtract(bignum2);
System.out.println("差 是:" + bignum3);
//乘法
bignum3 = bignum1.multiply(bignum2);
System.out.println("积 是:" + bignum3);
//除法
bignum3 = bignum1.divide(bignum2);
System.out.println("商 是:" + bignum3);
总结
- 在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。
- 尽量使用参数类型为String的构造函数。
- BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值