zoukankan      html  css  js  c++  java
  • 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("
    ");
            
            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

  • 相关阅读:
    网站优化,dns预解析,解析缓存
    dos命名重启或关闭远程服务器
    IIS 常见问题集记录
    EF 基础提供程序在 Open 上失败
    flexbox学习
    svn post-commit 同步
    备份
    log4net 2.0.4有问题,AdoNetAppender会报错
    signalr 配置错误跟踪
    Facebook的Web开发三板斧:React.js、Relay和GraphQL
  • 原文地址:https://www.cnblogs.com/Lemon1234/p/11619950.html
Copyright © 2011-2022 走看看