java Decimal(BigDecimal、BigInteger)总结

Decimal基本类计算小数点不够精确

BigDecimal类

    解决Java中浮点型的精度丢失问题,是为了更精确计算小数
    在一些需要高精度计算的问题,比如金融里面的钱的计算,推荐使用BigDecimal
    public BigDecimal add(BigDecimal augend)
    public BigDecimal subtract(BigDecimal subtrahend)
    public BigDecimal multiply(BigDecimal multiplicand)
    public BigDecimal divide(BigDecimal divisor)

package com.gx.commonclass;

import java.math.BigDecimal;
/**
 * BigDecimal类
 * @author en
 *
 */
public class BigDecimalDemo {
	public static void main(String[] args) {
		
		demo2();
		
		 
	}
	
	public static void demo2(){ 
		Double DB=(double)(0.06000000000000000) + (double)(0.01000000000000000);
		
		
		//浮点型的精度丢失问题      
		System.out.println("0.06 + 0.01 = " + (0.06001 + 0.01));
		System.out.println("1.0 - 0.38 = " + (1.0 - 0.33));
		System.out.println("4.015 * 100 = " + (4.015 * 100));
		System.out.println("1123.3 / 100 = " + (1123.3 / 100));
		
		
		BigDecimal f1 = new BigDecimal("0.05");//推荐使用
		BigDecimal f2 = BigDecimal.valueOf(0.05);//推荐使用
		BigDecimal f3 = new BigDecimal(0.05);//不推荐使用
		System.out.println("f1 = "+f1);
		System.out.println("f2 = "+f2);
		System.out.println("f3 = "+f3);
		
		System.out.println("使用String作为BigDecimal构造器参数:");
		System.out.println("0.05 + 0.05 = " + f1.add(f2));// +
		System.out.println("0.05 - 0.05 = " + f1.subtract(f2));// -
		System.out.println("0.05 * 0.05 = " + f1.multiply(f2));// *
		System.out.println("0.05 / 0.05 = " + f1.divide(f2));// /
		System.out.println("0.05 ^ 2 = " + f1.pow(2));
		System.out.println("b1%b2="+f1.remainder(f2)); //取余
		
		System.out.println("使用double作为BigDecimal构造器参数:");
		System.out.println("0.05 + 0.05 = " + f3.add(f2));
		System.out.println("0.05 - 0.05 = " + f3.subtract(f2));
		System.out.println("0.05 * 0.05 = " + f3.multiply(f2));
		System.out.println("0.05 / 0.05 = " + f3.divide(f2));
		System.out.println("0.05 ^ 2 = " + f3.pow(2));
	}
	
	public static void demo1(){

		BigDecimal b1=new BigDecimal("27");
		BigDecimal b2=new BigDecimal(3);
		BigDecimal b3=BigDecimal.valueOf(15.8);
		
		System.out.println("b1+b2="+b1.add(b2)); //加
		System.out.println("b1-b2="+b1.subtract(b2)); //减
		System.out.println("b1*b2="+b1.multiply(b2)); //乘
		System.out.println("b1/b2="+b1.divide(b2)); //除
		System.out.println("b1%b2="+b1.remainder(b2)); //取余
		
		BigDecimal[] bigDecimals=b1.divideAndRemainder(b2);//除和取余
		for (BigDecimal bigDecimal : bigDecimals) {
			System.out.print(bigDecimal+",");
		}
		System.out.println();
		
		System.out.println("b1^3="+b1.pow(3));//n次方
		System.out.println("|b1|="+b1.abs());//绝对值
		System.out.println("-b1="+b1.negate());// this*-1
		System.out.println("b1取符号  "+b1.signum());//取符号位--》1为正数 0为零 -1为负数
		System.out.println(b1.max(b2));//获取b1、b2中最大的值
		System.out.println(b1.min(b2));//获取b1、b2中最小的值
		
		//BigDecimal转换成浮点型
		float f1=b1.floatValue();
		double d1=b1.doubleValue();
		
		System.out.println(b3);
		System.out.println(d1);
		System.out.println(f1);
	}
	
}

BigInteger

任意大的整数,原则上是,只要你的计算机的内存足够大,可以有无限位的(只能写整数)

package com.gx.commonclass;

import java.math.BigInteger;

/**
 * BigInteger 
 * 
 * @author en
 * 
 */
public class BigIntegerDemo {
	public static void main(String[] args) {
		BigInteger b1 = new BigInteger("100");
		BigInteger b2 = new BigInteger("36");
		BigInteger b3 = BigInteger.valueOf(25L);
		BigInteger b4 = BigInteger.TEN;
		System.out.println(b4);

		 System.out.println("b1+b2="+b1.add(b2)); //+
		 System.out.println("b1-b2="+b1.subtract(b2)); //-
		 System.out.println("b1*b2="+b1.multiply(b2)); //*
		 System.out.println("b1/b2="+b1.divide(b2)); //除
		BigInteger[] arr = b1.divideAndRemainder(b2); // 商和余数
		System.out.println("b1/b2="+arr[0]);
		System.out.println("b1%b2="+arr[1]);
		System.out.println("b1%b2="+b1.remainder(b3));// 取余
		System.out.println("b1^2="+b1.pow(2));// 2次方
		System.out.println("b1和b2的最大公约数="+b1.gcd(b2));// 公约数
		System.out.println("|b1|="+b1.abs());// 绝对值
		System.out.println("-b1="+b1.negate());// 取负数 <==>*-1
		System.out.println("b1符号:"+b1.signum());// 符号函数 1 0 -1
		//
		b1=BigInteger.valueOf(4);
		b2=BigInteger.valueOf(1);
		System.out.println(b1.and(b2));// 且
		System.out.println(b1.or(b2));// 或
		System.out.println(b1.xor(b2));// 异或
		System.err.println(b1.not());// 非
		
		
		/**
		 * 如果此 BigInteger 可能为素数,则返回 true,如果它一定为合数,则返回 false。如果 certainty <= 0,则返回 true。
		 * 
		 * 参数:
		 * 
		 * certainty - 调用方允许的不确定性的度量。如果该调用返回 true,则此 BigInteger 是素数的概率超出 (1 - 1/2certainty)。此方法的执行时间与此参数的值是成比例的。
		 * 
		 * 返回:
		 * 
		 * 如果此 BigInteger 可能为素数,则返回 true,如果它一定为合数,则返回 false。
		 */
		System.out.println(b1.isProbablePrime(2));
		
		System.out.println(b1.max(b2));
		System.out.println(b1.min(b2));
		
		//转换成int  溢出
		b1=BigInteger.valueOf(100);
		System.out.println(b1.pow(818));
		System.out.println("===>"+b1.pow(18).intValue());
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值