Java大数操作(BigInteger,BigDecimal)

  1. BigInteger
    1. 创建一个BigInteger 常用方式
    2. 常见运算操作方法
  2. BigDecimal
    1. 创建一个BigDecimal常用方式
    2. 常见运算操作方法
    3. 除法
    4. 舍入模式
    5. 华为机试题

BigInteger

不可变的任意精度的整数。所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型)。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。

创建一个BigInteger 常用方式

(1)使用构造函数

// 将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
BigInteger base = new BigInteger("16");

(2)静态方法

// 返回其值等于指定 long 的值的 BigInteger。
// 返回 BigInteger,如果值在 -16-16 之间,那么返回的 BigInteger是同一个对象。
BigInteger base = BigInteger.valueOf(16);
System.out.println(BigInteger.valueOf(16) == BigInteger.valueOf(16));//true
System.out.println(BigInteger.valueOf(17) == BigInteger.valueOf(17));//false
System.out.println(BigInteger.valueOf(-16) == BigInteger.valueOf(-16));//true
System.out.println(BigInteger.valueOf(-17) == BigInteger.valueOf(-17));//false

常见运算操作方法

import java.math.BigInteger;
public class BigIntegerDemo1 {
    public static void main(String[] args) {
        BigInteger bi1 = new BigInteger("123456789");  // 声明BigInteger对象
        BigInteger bi2 = new BigInteger("987654321");  // 声明BigInteger对象
        System.out.println("加法操作:" + bi2.add(bi1));    // 加法操作
        System.out.println("减法操作:" + bi2.subtract(bi1));   // 减法操作
        System.out.println("乘法操作:" + bi2.multiply(bi1));   // 乘法操作
        System.out.println("除法操作:" + bi2.divide(bi1)); // 除法操作
        BigInteger result[] = bi2.divideAndRemainder(bi1); // 求出余数的除法操作
        System.out.println("商是:" + result[0] + ";余数是:" + result[1]);
        System.out.println("最大数:" + bi2.max(bi1));  // 求出最大数
        System.out.println("最小数:" + bi2.min(bi1));  // 求出最小数
    }
}

BigDecimal

不可变的、任意精度的有符号十进制数。

创建一个BigDecimal常用方式

(1)使用构造函数

BigDecimal b1 = new BigDecimal("12.1");

(2)静态方法

// 参数是 double 类型
BigDecimal b2 = BigDecimal.valueOf(12.1);

常见运算操作方法

import java.math.BigDecimal;
public class BigDecimalDemo {
    public static void main(String[] args) {
        BigDecimal b1 = new BigDecimal("10.345");
        BigDecimal b2 = new BigDecimal("3.333");

        System.out.println("加法运算:" + b1.add(b2)); // 13.678
        System.out.println("减法运算:" + b1.subtract(b2)); // 7.012
        System.out.println("乘法运算:" + b1.multiply(b2)); // 34.479885
        // System.out.println("除法运算:" + b1.divide(b2) // 报错,
            // 返回一个 BigDecimal,其值为 (this / divisor),其首选标度为 (this.scale() - divisor.scale());
            // 如果无法表示准确的商值(因为它有无穷的十进制扩展),则抛出 ArithmeticException。

        System.out.println("除法运算:" + b1.divide(b2, 3, BigDecimal.ROUND_HALF_EVEN)); // 3.104
        System.out.println("除法运算:" + b1.divide(b2, BigDecimal.ROUND_HALF_EVEN)); // 3.104,其标度为 this.scale()。

        System.out.println("加法运算:" + MyMath.round(MyMath.add(10.345, 3.333), 1)); // 13.7
        System.out.println("减法运算:" + MyMath.round(MyMath.sub(10.345, 3.333), 3)); // 7.012
        System.out.println("乘法运算:" + MyMath.round(MyMath.mul(10.345, 3.333), 4)); // 34.4799
        System.out.println("除法运算:" + MyMath.div(10.345, 3.333, 3)); // 3.104
    }
}

class MyMath {
    public static double add(double d1, double d2) { // 进行加法计算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.add(b2).doubleValue(); // 将此 BigDecimal 转换为 double。
    }

    public static double sub(double d1, double d2) { // 进行减法计算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.subtract(b2).doubleValue();
    }

    public static double mul(double d1, double d2) { // 进行乘法计算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.multiply(b2).doubleValue();
    }

    public static double div(double d1, double d2, int len) { // 进行除法计算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /*
    进行四舍五入
     */
    public static double round(double d, int len) {
        BigDecimal b1 = new BigDecimal(d);
        BigDecimal b2 = new BigDecimal(1); // 技巧
        return b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}

除法

BigDecimal divide(BigDecimal divisor)
          返回一个 BigDecimal,其值为 (this / divisor),其首选标度为 (this.scale() - divisor.scale());
          如果无法表示准确的商值(因为它有无穷的十进制扩展),则抛出 ArithmeticException。
BigDecimal divide(BigDecimal divisor, int roundingMode)
          返回一个 BigDecimal,其值为 (this / divisor),其标度为 this.scale()。
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
          返回一个 BigDecimal,其值为 (this / divisor),其标度为指定标度scale。

舍入模式

static int ROUND_CEILING
          接近正无穷大的舍入模式。
static int ROUND_DOWN
          接近零的舍入模式。
static int ROUND_FLOOR
          接近负无穷大的舍入模式。
static int ROUND_HALF_DOWN
          向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
static int ROUND_HALF_EVEN
          向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
static int ROUND_HALF_UP
          向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
static int ROUND_UNNECESSARY
          断言请求的操作具有精确的结果,因此不需要舍入。
static int ROUND_UP
          舍入远离零的舍入模式。

华为机试题

写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;

public class BinHexOct {

    public static void main(String[] args) {
        test2();
    }

    /*
    直接使用的JavaAPI--Integer提供的方法,将十六进制进行转换
     */
    private static void test1() {
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        String line;
        try {
            while ((line = bufr.readLine()) != null) {
                line = line.substring(2);
                int result = Integer.parseInt(line, 16);
                System.out.println(result);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /*
    处理大数的情况
     */
    public static void test2() {
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        String line;
        BigInteger base = new BigInteger("16");
        try {
            while ((line = bufr.readLine()) != null) {
                line = line.substring(2);
                //int result = Integer.parseInt(line, 16);
                BigInteger result = new BigInteger("0");
                for (int i = 0; i < line.length(); i++) {
                    char ch = line.charAt(line.length() - 1 - i);
                    if (ch >= 'A' && ch <= 'F') {
                        //pow n的m次幂,返回 BigInteger
                        BigInteger tmp = base.pow(i).multiply(new BigInteger(Integer.toString((ch - 'A' + 10))));
                        result = result.add(tmp);
                    } else {
                        BigInteger tmp = base.pow(i).multiply(new BigInteger(Character.toString(ch)));
                        result = result.add(tmp);
                    }
                }
                System.out.println(result);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

http://blog.csdn.net/zhongkelee/article/details/52289163
https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html
https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:Java大数操作(BigInteger,BigDecimal)

文章字数:1.5k

本文作者:Bin

发布时间:2018-03-17, 15:26:57

最后更新:2019-08-06, 00:07:35

原始链接:http://coolview.github.io/2018/03/17/Java/Java%20%E5%A4%A7%E6%95%B0%E6%93%8D%E4%BD%9C%EF%BC%88BigInteger%EF%BC%8CBigDecimal%EF%BC%89/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录