Java之处理数学计算
Java中除了有简单的计算运算符进⾏计算之外,还提供了Math、BigInteger、BigDecimal等类来进⾏复杂的数学计算,例如进⾏三⾓函数计算、平⽅根、幂等运算。
Math类
介绍
Math 类包含⽤于执⾏基本数学运算的⽅法,如初等指数、对数、平⽅根和三⾓函数。和String类⼀样都是⽤final修饰,所以不能有⼦类,还有就是它的构造⽅法是私有的,也就是我们不能通过new的⽅法在其它类中构造Math对象,那么我们怎样调⽤它的⽅法,原来它的所有的⽅法都是静态⽅法,也就是可以直接使⽤类名就可以访问⽅法了。
使⽤
具体的使⽤见下⾯代码,详细的api查看⽂档
public static void main(String[] args)
{
float num1 =28.3f;
float num2 =28.7f;
System.out.println("il(double a)返回⼤于或等于 a 的最⼩整数值:");
System.out.il(num1));
System.out.il(num2));
System.out.println("\nMath.floor(double a)返回⼩于或等于 a 的最⼤整数值:");
System.out.println(Math.floor(num1));
System.out.println(Math.floor(num2));
System.out.println("\und(float a)返回指定数字的取整值:");
System.out.und(num1));
System.out.und(num2));
}
Math包
提供⽤于执⾏任意精度整数运算( BigInteger )和任意精度⼗进制算术( BigDecimal )的类。 BigInteger类似于原始整数类型,除了它提供任意精度,因此BigInteger的操作不会溢出或丢失精度。 除标准算术运算外, BigInteger还提供模运算,GCD计算,素数测试,素数⽣成,位操作以及⼀些其他杂项操作。 BigDecimal提供适⽤于货币计算等的任意精度有符号⼗进制数。 BigDecimal使⽤户可以完全控制舍⼊⾏为,允许⽤户从⼀组全⾯的⼋种舍⼊模式中进⾏选择。
BigInteger
BigInteger是java.math包提供的处理⼤整数类型,实现了⼤整数的存储,四则运算,判断素数的⽅法,求幂,求模,求逆元,求最⼤公约数等⽅法。
BigIngeter类的⽬的——实现⾼精度数的存储和计算。基础的实现机理——⽤int型(32位)数组存储数据。
BigInteger 的使⽤
BigInteger 是⼀个Java类,通过构造⽅法获取对象,通过对象来调⽤⽅法。
public static void main(String[] args){
// create 3 BigInteger objects
BigInteger bi1, bi2, bi3;
// create 3 int objects
bigdecimal格式化两位小数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。
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(objpareTo(BigDecimal.ZERO)==0){
return"0.00";
}else if(objpareTo(BigDecimal.ZERO)>0&&objpareTo(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);
总结
1. 在需要精确的⼩数计算时再使⽤BigDecimal,BigDecimal的性能⽐double和float差,在处理庞⼤,复杂的运算时尤为明显。故⼀般
精度的计算没必要使⽤BigDecimal。
2. 尽量使⽤参数类型为String的构造函数。
3. BigDecimal都是不可变的(immutable)的, 在进⾏每⼀次四则运算时,都会产⽣⼀个新的对象 ,所以在做加减乘除运算时要记得
要保存操作后的值

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。