Java之处理数学计算

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);  
总结
  1. 在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。
  2. 尽量使用参数类型为String的构造函数。
  3. BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值