大整数操作—BigInteger类

  • 应用场景
    正常情况下,整数的类型中,能表示的最大整数必然是Long类型,为8个字节,但如果有这么一个数字为132456489745156784165458784156
    因为 long类型 的整数范围是有限的,在 Java中 引入了专门用来进行大数操作的一个类 —— BigInteger类。
  • 方法
  • 构造方法
  • 方法

bigInt在Java中对应的类型 java中biginteger_四舍五入


bigInt在Java中对应的类型 java中biginteger_最小值_02


bigInt在Java中对应的类型 java中biginteger_最小值_03


bigInt在Java中对应的类型 java中biginteger_bigInt在Java中对应的类型_04

  • 例子
import java.math.BigInteger;

public class Test {
    public static void main(String[] args) {
        // 用来保存 两个大数
        BigInteger b1 = new BigInteger("987654321098765432109876543210");
        BigInteger b2 = new BigInteger("123456789012345678901234567890");

        // 两个大数的运算(加减乘除、最大值、最小值)
        System.out.println("b1 + b2 = " + b1.add(b2));        // 加
        System.out.println("b1 - b2 = " + b1.subtract(b2));   // 减
        System.out.println("b1 * b2 = " + b1.multiply(b2));   // 乘
        System.out.println("b1 / b2 = " + b1.divide(b2));     // 除
        System.out.println("max: " + b1.max(b2));        // 最大值
        System.out.println("min: " + b1.min(b2));        // 最小值
        System.out.println();

        // 除法操作,数组的第一个元素是除法的商,第二个元素是除法的余数
        BigInteger[] bArr = b1.divideAndRemainder(b2);
        System.out.println("商:" + bArr[0]);
        System.out.println("余数:" + bArr[1]);
    }
}

bigInt在Java中对应的类型 java中biginteger_最小值_05

大小数操作—-BigDecimal类

  • 应用
    在日常开发中我们经常会碰到小数运算,而小数直接进行运算的话会出现一些,请看下列代码:
System.out.println(2.00 - 1.10);

  如果不看输出结果,我们很有可能会认为输出的是 0.9,可真正输出的却是0.8999999999999999。这是为什么呢?这是因为我们计算机在进行浮点运算时,采用的是二进制运算,这样做非常容易导致精度丢失(如上列代码)。
所以进行小数的精确计算,需要用到BigDecimal类

  • 字段摘要
  • 构造方法
  • 方法



BigDecimal舍入模式

尽管数据库存储的是一个高精度的浮点数,但是通常在应用中展示的时候往往需要限制一下小数点的位数,比如两到三位小数即可,这时就需要使用到setScale(int newScale, int roundingMode)函数,作为BigDecimal的公有静态变量,舍入模式(Rounding Mode)的运算规则比较多,公有八种,这里作个说明,官方文档也有介绍。

ROUND_UP
向远离零的方向舍入。舍弃非零部分,并将非零舍弃部分相邻的一位数字加一。

ROUND_DOWN
向接近零的方向舍入。舍弃非零部分,同时不会非零舍弃部分相邻的一位数字加一,采取截取行为。

ROUND_CEILING
向正无穷的方向舍入。如果为正数,舍入结果同ROUND_UP一致;如果为负数,舍入结果同ROUND_DOWN一致。注意:此模式不会减少数值大小。

ROUND_FLOOR
向负无穷的方向舍入。如果为正数,舍入结果同ROUND_DOWN一致;如果为负数,舍入结果同ROUND_UP一致。注意:此模式不会增加数值大小。

ROUND_HALF_UP
向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分>= 0.5,则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。这种模式也就是我们常说的我们的“四舍五入”。

ROUND_HALF_DOWN
向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向下舍入的舍入模式。如果舍弃部分> 0.5,则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。这种模式也就是我们常说的我们的“五舍六入”。

ROUND_HALF_EVEN
向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则相邻的偶数舍入。如果舍弃部分左边的数字奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。注意:在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况,如果前一位为奇数,则入位,否则舍去。

ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

下面,举个例子说明一下不同舍入模式下的数值计算结果,保留一位小数:

bigInt在Java中对应的类型 java中biginteger_最小值_06


  • 舍入模式的设置
    BigDecimal的setScale方法

BigDecimal.setScale()

方法用于格式化小数点

表示保留一位小数,默认用四舍五入方式

setScale(1)

直接删除多余的小数位,如2.35会变成2.3 setScale(1,BigDecimal.ROUND_DOWN)

进位处理,2.35变成2.4 setScale(1,BigDecimal.ROUND_UP)

四舍五入,2.35变成2.4 setScale(1,BigDecimal.ROUND_HALF_UP)

四舍五入,2.35变成2.3,如果是5则向下舍setScaler(1,BigDecimal.ROUND_HALF_DOWN)

更多模式请查询API

注意点一

scale指的是你小数点后的位数。 scale()就是BigDecimal类中的方法。如 BigDecimal b = new BigDecimal(“123.456”); b.scale()返回的就是3

注意点二

roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段, 有很多种,如 BigDecimal.ROUND_HALF_UP表示的就是4舍5入