Java【大数类】整理

Java中有两个类可以来处理高精度的计算:
分别是处理整数的BigInteger和处理小数的BigDecimal

BigInteger 只可用于整数

BigInteger 内部使用 int[] 数组来存储任意大小的整形数据。

相对于常规整数类型的运算来说,BigInteger 运算的效率会相对较低。

构造方法

BigInteger(byte[] val) 
将包含BigInteger的二进制补码二进制表达式的字节数组转换为BigInteger 
BigInteger(int numBits, Random rnd) 
构造一个随机生成的BigInteger,均匀分布在0到(2 numBits - 1)的范围内。  
BigInteger(String val)BigInteger的十进制字符串表示形式转换为BigInteger

加法 add( )

import java.math.BigInteger;
import java.io.*;

public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        BigInteger a = new BigInteger(reader.readLine());
        BigInteger b = new BigInteger(reader.readLine());
        System.out.println(a.add(b));
        reader.close();
    }
}

减法 subtract( )

import java.io.*;
import java.math.BigInteger;

public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BigInteger a = new BigInteger(reader.readLine());
        BigInteger b = new BigInteger(reader.readLine());
        System.out.println(a.subtract(b));
        reader.close();
    }
}

乘法 multiply( )

import java.io.*;
import java.math.BigInteger;

public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BigInteger a = new BigInteger(reader.readLine());
        BigInteger b = new BigInteger(reader.readLine());
        System.out.println(a.multiply(b));
        reader.close();
    }
}

除法 divideAndRemainder( )

import java.io.*;
import java.math.BigInteger;

public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BigInteger a = new BigInteger(reader.readLine());
        BigInteger b = new BigInteger(reader.readLine());
        //divide 返回值为 a/b
        BigInteger[] c = a.divideAndRemainder(b); //返回值为数组,分别为a/b和a%b
        System.out.println(c[0]);
        System.out.println(c[1]);
        reader.close();
    }
}

取余 mod( )

import java.io.*;
import java.math.BigInteger;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BigInteger a = new BigInteger(reader.readLine());
        BigInteger b = new BigInteger(reader.readLine());
        System.out.println(a.mod(b));
        reader.close();
    }
}

BigDecimal 处理浮点数运算

Java 提供了BigDecimal 来操作浮点数。BigDecimal 的实现利用到了 BigInteger (用来操作大整数), 所不同的是 BigDecimal 加入了小数位的概念。

构造方法

BigDecimal(char[] in) 
一个转换的字符数组表示 BigDecimalBigDecimal ,接受字符作为的相同序列 BigDecimal(String)构造。  
BigDecimal(char[] in, int offset, int len) 
一个转换的字符数组表示 BigDecimalBigDecimal ,接受字符作为的相同序列 BigDecimal(String)构造,同时允许一个子阵列被指定。    
BigDecimal(double val)double转换为 BigDecimal ,这是 double的二进制浮点值的精确十进制表示 
BigDecimal(int val)intBigDecimal
BigDecimal(long val)longBigDecimal
BigDecimal(String val)  

《阿里巴巴 Java 开发手册》对这部分内容有提到:
在这里插入图片描述
结论为——使用 String 作为参数的构造方法。

加法 add( )

import java.io.*;
import java.math.BigDecimal;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BigDecimal a = new BigDecimal(reader.readLine());
        BigDecimal b = new BigDecimal(reader.readLine());
        System.out.println(a.add(b));
        reader.close();
    }
}

减法 subtract( )

乘法 multiply( )

除法 divide( )

import java.io.*;
import java.math.BigDecimal;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BigDecimal a = new BigDecimal(reader.readLine());
        BigDecimal b = new BigDecimal(reader.readLine());
        System.out.println(a.divide(b));
        reader.close();
    }
}

这里需要注意的是,在我们使用 divide 方法的时候尽量使用 3 个参数版本,并且RoundingMode 不要选择 UNNECESSARY,否则很可能会遇到 ArithmeticException(无法除尽出现无限循环小数的时候),其中 scale 表示要保留几位小数,roundingMode 代表保留规则。

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
System.out.println(a.divide(b, 2, RoundingMode.HALF_UP));// 1.11

保留规则非常多,这里列举几种:

public enum RoundingMode {
	// 2.5 -> 3 , 1.6 -> 2
	// -1.6 -> -2 , -2.5 -> -3
	UP(BigDecimal.ROUND_UP),
	// 2.5 -> 2 , 1.6 -> 1
	// -1.6 -> -1 , -2.5 -> -2
	DOWN(BigDecimal.ROUND_DOWN),
	// 2.5 -> 3 , 1.6 -> 2
	// -1.6 -> -1 , -2.5 -> -2
	CEILING(BigDecimal.ROUND_CEILING),
	// 2.5 -> 2 , 1.6 -> 1
	// -1.6 -> -2 , -2.5 -> -3
	FLOOR(BigDecimal.ROUND_FLOOR),
	// 2.5 -> 3 , 1.6 -> 2
	// -1.6 -> -2 , -2.5 -> -3
	HALF_UP(BigDecimal.ROUND_HALF_UP),
	//......
}

取余 remainder( )

import java.io.*;
import java.math.BigDecimal;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BigDecimal a = new BigDecimal(reader.readLine());
        BigDecimal b = new BigDecimal(reader.readLine());
        System.out.println(a.remainder(b));
        reader.close();
    }
}

大小比较

a.compareTo(b) : 返回 -1 表示 a 小于 b,0 表示 a 等于 b , 1 表示 a 大于 b。

警告! 不要使用 .equals() 来判断,因为:
在这里插入图片描述

保留几位小数

通过 setScale 方法设置保留几位小数以及保留规则。保留规则有挺多种,不需要记,IDEA 会提示。

BigDecimal m = new BigDecimal("1.255433");
BigDecimal n = m.setScale(3,RoundingMode.HALF_DOWN);
System.out.println(n);// 1.255

踩坑点:注意!

BigDecimal 的创建,输入的变量是 字符串! 不能是基本数据类型,否则会出现意料之外的错误。

double a = 1.3, b = 1.2;
System.out.println(a * b);
BigDecimal bigDecimal1 = new BigDecimal(1.3);
BigDecimal bigDecimal2 = new BigDecimal(1.2);
System.out.println(bigDecimal1.multiply(bigDecimal2));
BigDecimal bigDecimal3 = new BigDecimal("1.3");
BigDecimal bigDecimal4 = new BigDecimal("1.2");
System.out.println(bigDecimal3.multiply(bigDecimal4));

输出结果为:

1.56
1.55999999999999999555910790149937186615321027510720522067858679303442581698391222744248807430267333984375
1.56
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wei *

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值