超过常规数值范围的大数运算

超出数值范围的大数进行运算

如果基本整数和浮点数精度不能满足需求,那么可以使用java.math包中的BigInteger和BigDecimal两个类。这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。

BigInteger

将普通数转化为大数

BigInteger a=BigInteger.valueOf(num);//num需要转化的数值

常用的方法

BigInteger add(BigInteger other)        //加
BigInteger subtract(BigInteger other)   //减
BigInteger multiply(BigInteger other)   //乘
BigInteger divide(BigInteger other)     //除

不能用常见的算术运算符对大数值运算

示例

import java.math.BigInteger;
public class Test {
    public static void main(String[] args) {
        BigInteger num=BigInteger.valueOf(2);
        for (int i = 0; i < 100; i++) {
            num=num.multiply(BigInteger.valueOf(2));//需要提供BigInteger类型
        }
        System.out.println(num);//2535301200456458802993406410752
    }
}


BigDecimal

BigDecimalJava中用于表示任意精度数字的类,它可以表示无限长度的小数,BigDecimal 通常支持任意位数的小数部分,用来对超过16位有效位的数进行精确的运算。

注:1.BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

2.BigDecimal进行运算时必须要保证对象本身不能是null,否则就会抛空指针异常。

构造方法

方法 含义
BigDecimal(int val) 创建一个具有参数所指定整数值的对象
BigDecimal(double val) 创建一个具有参数所指定双精度值的对象
BigDecimal(long val) 创建一个具有参数所指定长整数值的对象
BigDecimal(String val) 创建一个具有参数所指定以字符串表示的数值的对象

常用的方法

方法 含义
add(BigDecimal) BigDecimal对象中的值相加,返回BigDecimal对象
subtract(BigDecimal) BigDecimal对象中的值相减,返回BigDecimal对象
multiply(BigDecimal) BigDecimal对象中的值相乘,返回BigDecimal对象
divide(BigDecimal) BigDecimal对象中的值相除,返回BigDecimal对象。
abs() 将BigDecimal对象中的值转换成绝对值
doubleValue() 将BigDecimal对象中的值转换成双精度数
floatValue() 将BigDecimal对象中的值转换成单精度数
longValue() 将BigDecimal对象中的值转换成长整数
intValue() 将BigDecimal对象中的值转换成整数
compareTo(BigDecimal val) 比较大小,返回int类型。0(相等) 1(大于) -1(小于)
max(BigDecimal val) 两值比较,返回最大值
negate() 求相反数,正变负,负变正
pow(int n) 求乘方,如BigDecimal.valueOf(2).pow(3)的值为8
remainder(BigDecimal n) 取模运算

取模运算示例

import java.math.BigDecimal;

public class BigDecimalModulus {
	public static void main(String[] args) {
		BigDecimal dividend = new BigDecimal("10");
		BigDecimal divisor = new BigDecimal("3");
		BigDecimal remainder = dividend.remainder(divisor);//10模3
		System.out.println("余数:" + remainder);
	}
}

取整运算

1. 向上取整 (ROUND_UP)

ROUND_UP模式会对非0舍弃部分前面的数字加1。例如:

BigDecimal bd = new BigDecimal("12.1");

long l = bd.setScale(0, BigDecimal.ROUND_UP).longValue();  // 结果为13

对于负数,结果如下:

BigDecimal bd = new BigDecimal("-12.1");

long l = bd.setScale(0, BigDecimal.ROUND_UP).longValue();  // 结果为-13

这种模式始终对非0舍弃部分前面的数字加1。

2. 向下取整 (ROUND_DOWN)

ROUND_DOWN模式直接舍弃小数部分。例如:

BigDecimal bd = new BigDecimal("12.9");

long l = bd.setScale(0, BigDecimal.ROUND_DOWN).longValue();  // 结果为12

对于负数,结果如下:

BigDecimal bd = new BigDecimal("-12.9");

long l = bd.setScale(0, BigDecimal.ROUND_DOWN).longValue();  // 结果为-12

这种模式从不对舍弃部分前面的数字加1。

3. 四舍五入 (ROUND_HALF_UP)

ROUND_HALF_UP模式是我们常见的四舍五入。例如:

BigDecimal bd = new BigDecimal("12.5");

long l = bd.setScale(0, BigDecimal.ROUND_HALF_UP).longValue();  // 结果为13

对于负数,结果如下:

BigDecimal bd = new BigDecimal("-12.5");

long l = bd.setScale(0, BigDecimal.ROUND_HALF_UP).longValue();  // 结果为-13

这种模式如果舍弃部分 >= 0.5,则舍入行为与ROUND_UP相同。

4. 四舍六入,五分两种情况 (ROUND_HALF_EVEN)

ROUND_HALF_EVEN模式也称为“银行家舍入法”,主要在美国使用。例如:

BigDecimal bd = new BigDecimal("1.25");

long l = bd.setScale(1, BigDecimal.ROUND_HALF_EVEN).longValue();  // 结果为1.2

这种模式如果舍弃部分左边的数字为奇数,则舍入行为与ROUND_HALF_UP相同;如果为偶数,则舍入行为与ROUND_HALF_DOWN相同。

示例

import java.math.BigDecimal;

public class Test {
    public static void main(String[] args){
        BigDecimal b1 = new BigDecimal("1");
        BigDecimal b2 = new BigDecimal("2");
        BigDecimal b3 = new BigDecimal("4");
        System.out.println("相加:"+b1.add(b2));
        System.out.println("相减:"+b1.subtract(b2));
        System.out.println("相乘:"+b2.multiply(b3));
        System.out.println("相除:"+b2.divide(b3));
    }
}

posted @   狐狸胡兔  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示