BigInteger&BigDecimal

BigInteger

1、赋值:

1、BigInteger a=new BigInteger("1");
2、BigInteger b=BigInteger.valueOf(1);
3、A=BigInteger.ONE 1
4、B=BigInteger.TEN 10
5、C=BigInteger.ZERO 0
6、n.compareTo(BigInteger.ZERO)==0 //相当于n==0
7、if(a[i].compareTo(n)>=0 &&a[i].compareTo(m)<=0) // a[i]>=n && a[i]<=m

2、运算 :

大数的加减运算不同于普通整数的加减乘除运算

1 加—— a+b: a=a.add(b);
2 减—— a-b: a=a.subtract(b);
3 乘—— a*b: a=a.multiply(b);
4 除—— a/b: a=a.divide(b);
5 求余—a%b: a=a.mod(b);
6 转换—a=b: b=BigInteger.valueOf(a);
7 去反数—— -a:a.negate()
8 幂——a^b: a.pow(b)
9 绝对值——|c|:c.abc()
10 最大公约数——gcd(a,b)=a.gcd(b)
11比较 if (ans.compareTo(x) == 0) System.out.println("相等")

3.BigInteger与String:
1、将指定字符串转换为十进制表示形式;
BigInteger(String val);
2、将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger
BigInteger(String val,int radix);
3、BigInteger 的十进制字符串表示形式
BigInteger(str,radix)
4、 BigInteger 的给定基数的字符串表示形式
toString(int radix)

package Content;

import java.util.*;
import java.math.BigInteger;


public class BigNumber {
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        //大数类型不能直接赋值
        BigInteger num1 = BigInteger.ONE;  // <=> BigInteger num1 = BigInteger.valueOf(1); 
        BigInteger num2 = BigInteger.valueOf(2);
        System.out.println("num1 = "+num1);
        System.out.println("num2 = "+num2);
        
        BigInteger a,b,c;
        BigInteger ans_add,ans_sub,ans_mul,ans_div,ans_mod,ans_gcd;
        
        a = scanner.nextBigInteger();
        b = scanner.nextBigInteger();
        c = scanner.nextBigInteger();
        
        System.out.println("a = "+ a);
        System.out.println("b = "+ b);
        System.out.println("a反数="+a.negate());
        System.out.println("|c|="+ c.abs());
        System.out.println("c^2="+c.pow(2));
        
        
        ans_add = a.add(b); //a+b
        ans_sub = a.subtract(b); //a-b
        ans_mul = a.multiply(b); //a*b
        ans_div = a.divide(b); //a/b
        ans_mod = a.mod(b); //a%b
        ans_gcd = a.gcd(b);// gcd(a,b)
        
        System.out.println("a + b = "+ans_add);
        System.out.println("a - b = "+ans_sub);
        System.out.println("a * b = "+ans_mul);
        System.out.println("a / b = "+ans_div);
        System.out.println("a % b = "+ans_mod);
        System.out.println("gcd(a,b)="+ans_gcd);
        
       
        //比较  
        if (a.compareTo(b) == 0) {
            System.out.println("相等");
        }else {
            System.out.println("不相等");
        }
        
        //BigInteger类型转换成Long类型或int类型问题
        int i = a.intValue();
        long l = b.longValue();
        float f = a.floatValue();
        double d = b.doubleValue(); 
        
         
        System.out.println(i);
        System.out.println(l);
        System.out.println(f);
        System.out.println(d);
        
        //转换 :(十进制)String<=>BigInteger
        System.out.println("String=>BigInteger:");
        String string1 = "12345";
        BigInteger bigInteger1 = new BigInteger(string1);  
        System.out.println("BigInteger = "+bigInteger1);
        
        System.out.println("BigInteger=>String:");
        System.out.println(bigInteger1.toString());  
        
        //转换:(*进制)String<=>BigInteger
        String string2 = "1000";
        BigInteger bigInteger2 = new BigInteger(string2,2);  
        System.out.println("string="+string2);
        System.out.println("BigInteger = "+bigInteger2);
        
        System.out.println("BigInteger=>String:");
        System.out.println(bigInteger1.toString(2)); 
         
    }
}
View Code

BigDecimal

BigDecimal的实现利用到了BigInteger, 所不同的是,BigDecimal加入了小数位的概念。

BigDecimal d = new BigDecimal(new BigInteger(ib),5);

 

5表示的是5个小数位。

 

BigDecimal可以用来做超大的浮点数的运算,比如+-*/的运算,其中除法运算是最复杂的。因为,在商的位数还有除不断的情况下,末位小数点的处理都是需要考虑的。   

 

new BigDecimal(-7.5).divide(new BigDecimal(1),0,BigDecimal.ROUND_UP); 
上面的这个运算中divide的第二个参数表示商的小数点位数,最后一个参数指的是近似处理的模式。

 

Java的基本类型提供了float和double类型,但他们在执行浮点运算的时候,只是提供了一个较为精确的结果,不能用于要求精确度很高的环境中。

因此,Java提供了BigDecimal类来保证结果的精确度。

BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做运算时千万要保存操作后的值。

使用BigDecimal的坏处是性能比double和float差,在处理庞大,复杂的运算时尤为明显,因根据实际需求决定使用哪种类型。

构造方法

BigDecimal(int):创建一个具有参数所指定整数值的对象。

BigDecimal(double):创建一个具有参数所指定双精度值的对象(不建议使用)。

BigDecimal(String):创建一个具有参数所指定以字符串表示的数值的对象。

BigDecimal add(BigDecimal augend):加法运算。

BigDecimal subtract(BigDecimal subtrahend):减法运算。

BigDecimal multiply(BigDecimal multiplicand):乘法运算。

BigDecimal divide(BigDecimal divisor):除法运算,可能会产生除零异常和不能整除异常。

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode):除法运算,可传入精确小数位数scale,和舍入模式roundingMode。

BigDecimal[] divideAndRemainder(BigDecimal divisor):获取商值和余数组成的数组,初始元素是商值,最终元素是余数。

BigDecimal setScale(int newScale, int roundingMode):进行舍入操作。

String toString():将BigDecimal对象的数值转换成字符串。

double doubleValue():将BigDecimal对象中的值以双精度数返回。

float floatValue():将BigDecimal对象中的值以单精度数返回。

int intValue():将BigDecimal对象中的值以整数返回。

BigDecimal.setScale()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍

1、scale指的是你小数点后的位数。比如123.456则score就是3.
比如:BigDecimal b = new BigDecimal("123.456");

<1> BigDecimal num1 = new BigDecimal(2.225667);//这种写法不允许,会造成精度损失

<2> BigDecimal num2 = new BigDecimal(2);//这种写法是可以的

<3>BigDecimal num = new BigDecimal("2.225667");//一般都会这样写最好


b.scale(),返回的就是3.
2、roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段,有很多种。
比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。

3、pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
的意思是说:我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式,例如:是四舍五入

舍入模式

BigDecimal.ROUND_UP:最后一位如果大于0,则向前进一位,正负数都如此。   

BigDecimal.ROUND_DOWN:最后一位不管是什么都会被舍弃。   

BigDecimal.ROUND_CEILING:如果是正数,按ROUND_UP处理;如果是负数,按照ROUND_DOWN处理。例如,7.1->8;-7.1->-7。所以,这种近似的结果都会>=实际值。   

BigDecimal.ROUND_FLOOR:跟BigDecimal_ROUND_CEILING相反。例如,7.1->7;-7.1->-8。这种处理的结果<=实际值。   

BigDecimal.ROUND_HALF_DOWN:如果最后一位<=5则舍弃,如果>5, 向前进一位。如,7.5->7;7.6->8;-7.5->-7 。  

BigDecimal.ROUND_HALF_UP:如果最后一位<5则舍弃,如果>=5, 向前进一位。反之舍弃。如,7.5->8;7.4->7;-7.5->-8 。  

BigDecimal.ROUND_HALF_EVEN:如果倒数第二位是奇数,按照BigDecimal.ROUND_HALF_UP处理;如果是偶数,按照BigDecimal.ROUND_HALF_DOWN来处理。如,7.5->8;8.5->8;7.4->7;-7.5->-8。

 

package Content;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;

public class BigDecimalDemo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        BigDecimal bigDecimal1 = new BigDecimal(6);
        BigDecimal bigDecimal2 = new BigDecimal("123");
        BigDecimal bigDecimal3 = new BigDecimal(25.234443535);//不推荐使用,容易造成精度损失
        BigDecimal bigDecimal4 = new BigDecimal("25.234443535");  
        
        System.out.println("bigDecimal1"+bigDecimal1);
        System.out.println("bigDecimal2"+bigDecimal2);
        System.out.println("bigDecimal3"+bigDecimal3);
        System.out.println("bigDecimal4"+bigDecimal4);
        System.out.println("\n");
        
        BigDecimal bigDecimal = new BigDecimal("6.87654321");
        //bigDecimal.setScale(2); //会出错,要指定舍入模式
        //System.out.println(new BigDecimal("1225.120").setScale(2));//不会出错
        System.out.println(bigDecimal.setScale(10));
        System.out.println("bigDecimal.scale="+bigDecimal.scale());
        System.out.println("BigDecimal.ROUND_UP"+bigDecimal.setScale(3,BigDecimal.ROUND_UP));
        System.out.println("BigDecimal.ROUND_DOWN :"+bigDecimal.setScale(3,BigDecimal.ROUND_DOWN));
        System.out.println("BigDecimal.ROUND_CEILING: "+bigDecimal.setScale(3,BigDecimal.ROUND_CEILING));
        System.out.println("BigDecimal.ROUND_FLOOR"+bigDecimal.setScale(3,BigDecimal.ROUND_FLOOR));
        System.out.println("BigDecimal.ROUND_HALF_UP"+bigDecimal.setScale(3,BigDecimal.ROUND_HALF_UP));
        System.out.println("BigDecimal.ROUND_HALF_DOWN"+bigDecimal.setScale(3,BigDecimal.ROUND_HALF_DOWN));
        System.out.println("ROUND_HALF_EVEN"+bigDecimal.setScale(3,BigDecimal.ROUND_HALF_EVEN));
        
        BigDecimal bigDecimall = new BigDecimal(6.1);
        
    }
}

 
View Code

 

 

 

转自https://www.cnblogs.com/shamao/p/10943539.html

posted @ 2019-10-03 16:06  七忆鱼  阅读(350)  评论(0编辑  收藏  举报