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());
}
}