Java 大数运算
2020.03.01 17:21
2020.03.01 17:23
1. 大数运算
在Java中有两个类BigInteger
和BigDecimal
分别表示不可变的任意精度的整数和不可变的有符号的任意精度的十进制数(浮点数)。
主要用于高精度计算中。这两个类使得java中的大数,高精度运算变得很简单,至于两个类的对象能表示最大范围不清楚,理论上能够表示无线大的数,只要计算机内存足够大。
这两个类都在java.math.*包中,因此每次必须在开头处引用该包。
为什么Java会有这两个大数类出现?
正常情况下一个整数最多只能放在long类型之中,但是如果现在有如下的一个数字:
1111111111111111111111111111111111111111111111111
根本就是无法保存的,所以为了解决这样的问题,在java中引入了两个大数的操作类:
- 操作整型:BigInteger
- 操作小数:BigDecimal
当然了,这些大数都会以字符串的形式传入。
2. BigInteger
BigInteger类的构造方法:
BigInteger b = new BigInteger(str);
构造方法中,采用字符串的形式给出整数
package test10;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
//大数据封装为BigInteger对象
BigInteger big1 = new BigInteger("12345678909876543210");
BigInteger big2 = new BigInteger("98765432101234567890");
//add实现加法运算
BigInteger bigAdd = big1.add(big2);
//subtract实现减法运算
BigInteger bigSub = big1.subtract(big2);
//multiply实现乘法运算
BigInteger bigMul = big1.multiply(big2);
//divide实现除法运算
BigInteger bigDiv = big2.divide(big1);
System.out.println("bigAdd = " + bigAdd);
System.out.println("bigSub = " + bigSub);
System.out.println("bigMul = " + bigMul);
System.out.println("bigDiv = " + bigDiv);
/*
* bigAdd = 111111111011111111100
bigSub = -86419753191358024680
bigMul = 1219326312117055326552354825111263526900
bigDiv = 8
* */
}
}
3. BigDecimal
在程序中执行下列代码,会出现什么问题?
System.out.println(0.09 + 0.01);
System.out.println(1.0 - 0.32);
System.out.println(1.015 * 100);
System.out.println(1.301 / 100);
double和float类型在运算中很容易丢失精度,造成数据的不准确性,Java提供我们BigDecimal类可以实现浮点数据的高精度运算;
构造方法如下:
BigDecimal b = new BigDecimal(str);
建议浮点数据以字符串形式给出,因为参数结果是可以预知的
实现加法减法乘法代码如下:(运算方法与BigInteger一致)
private static void test02() {
//大数据封装为BigDecimal对象
BigDecimal big1 = new BigDecimal("0.09");
BigDecimal big2 = new BigDecimal("0.01");
//add实现加法运算
BigDecimal bigAdd = big1.add(big2);
BigDecimal big3 = new BigDecimal("1.0");
BigDecimal big4 = new BigDecimal("0.32");
//subtract实现减法运算
BigDecimal bigSub = big3.subtract(big4);
BigDecimal big5 = new BigDecimal("1.105");
BigDecimal big6 = new BigDecimal("100");
//multiply实现乘法运算
BigDecimal bigMul = big5.multiply(big6);
//对于浮点数据的除法运算, 和整数不同, 可能出现无限不循环小数, 因此需要对所需要的位数进行保留和选择舍入模式
//BigDecimal b = big1.divide(big2,保留小数点后面几位,舍入模式)
BigDecimal b = big1.divide(big2, 2, RoundingMode.DOWN);
}
本节阅读完毕!
(分享)