Java大数字类

1 什么是大数字类

        在Java中,基本数据类型中整型最大范围是64位long型整数。但在实际应用中,可能需要存储超过该范围的整型数字,或者对超过该范围的多个整型数字进行计算。例如,在密码学中需要使用512位的整型数字作为密钥。Java中提供了BigInteger类来表示任意大小的整数,提供了BigDecimal类来表示任意大小且精度完全准确的浮点数。

        BigInteger和BigDecimal被称为Java中的大数字类,位于java.math包下,两个类均为Number类的子类。大数字类除了可以表示大数字以外,还提供了大数字的各类运算方法,如四则运算、幂运算等。

2 BigInteger示例

        编写代码,测试BigInteger类的用法。代码示意如下:

package api_02;
import java.math.BigInteger;

public class BigIntegerDemo {
    public static void main(String[] args) {
        // 创建BigInteger对象,封装大整数
        BigInteger i1 = new BigInteger("1234567890");
        BigInteger i2 = new BigInteger("12345678901234567890");
        BigInteger result1 = i1.add(i2); // 12345678902469135780
        System.out.println("result1= " + result1);
        BigInteger result2 = i1.multiply(i2); // 15241578751714678875019052100
        System.out.println("result2= " + result2);
        long l1 = result2.longValue(); // 转换为long类型,超范围会导致精度缺失
        System.out.println("l1="+l1); // -4871824193159134140
        // 转换为long类型,超范围会抛出异常
        long l2 =result2.longValueExact(); // BigInteger out of long range
    }
}

3 BigDecimal示例

        编写代码,测试BigDecimal类的用法。代码示意如下:

package api_02;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalDemo {
    public static void main(String[] args) {
        BigDecimal d1 = new BigDecimal("123.4567");
        BigDecimal d2 = d1.multiply(d1);
        System.out.println(d2); // 15241.55677489

        // BigDecimal用scale()表示小数位数
        BigDecimal d3 = new BigDecimal("12.34");
        BigDecimal d4 = new BigDecimal("12.3400");
        BigDecimal d5 = new BigDecimal("123400");
        System.out.println(d3.scale()); // 2
        System.out.println(d4.scale()); // 4
        System.out.println(d5.scale()); // 0

        // 可以对一个BigDecimal设置它的scale
        // 如果精度比原始值低,那么按照指定的方法进行四舍五入或者直接截断
        BigDecimal d6 = d1.setScale(2, RoundingMode.HALF_UP);
        BigDecimal d7 = d1.setScale(2, RoundingMode.DOWN);
        System.out.println(d6); // 123.46
        System.out.println(d7); // 123.45

        // 在比较两个BigDecimal的值是否相等时,
        // 使用equals()方法不但要求的值相等,还要求scale()相等
        BigDecimal d8 = new BigDecimal("123.456");
        BigDecimal d9 = new BigDecimal("123.45600");
        System.out.println(d8.equals(d9));
        // 应该使用compareTo()比较两个BigDecimal的值
        System.out.println(d8.compareTo(d9)); // 0 表示相等
    }
}

4 如何精确处理小数

        BigDecimal是Java中的一个类,用于进行高精度的数值计算。它提供了一种精确表示和操作任意精度的十进制数的方式,避免了使用浮点数在精度和舍入误差上可能存在的问题。

        下面是一个示例,说明BigDecimal如何比double更准确:

public class BigDecimalExample {	
    public static void main(String[] args) {
        double num1 = 0.1;
        double num2 = 0.2;
        double sum1 = num1 + num2;
        System.out.println("Sum using double: " + sum1); // 输出结果: 0.30000000000000004

        BigDecimal decimal1 = new BigDecimal("0.1");
        BigDecimal decimal2 = new BigDecimal("0.2");
        BigDecimal sum2 = decimal1.add(decimal2);
        System.out.println("Sum using BigDecimal: " + sum2); // 输出结果: 0.3
    }
}

        在上述示例中,使用double类型进行0.1和0.2的相加,由于浮点数的精度限制,计算结果会产生舍入误差,得到一个略微不准确的结果。而使用BigDecimal进行相加时,精确地表示了0.1和0.2,并得到了准确的计算结果。

        这个例子说明了在需要精确计算时,特别是涉及到货币、财务或其他需要准确小数表示的场景时,使用BigDecimal更可靠,避免了浮点数带来的舍入误差。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zhangyan_1010

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

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

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

打赏作者

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

抵扣说明:

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

余额充值