java 大整数编程_Java开发笔记(二十九)大整数BigInteger

早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字节大小。但是长整型也只能表达到负2的63次方~2的63次方-1,超出这个范围的巨大整数,竟连long类型也放不下。何况现在不管手机还是电脑的内存都是以GB计量,因此原先锱铢计较几个字节的数值类型便不合时宜了。为此Java又设计了一种大整数类型BigInteger,这个BigInteger能够表示任意大小的整数,而不再局限于多少位的数值范围。

乍看起来,BigInteger仿佛与Integer似曾相识,仅仅在类型开头添加了“Big”字样。事实上它俩个的类型设计有颇多异曲同工之处,二者的很多基本方法就是一模一样,例如初始化赋值的valueOf方法、比较相等的equals方法,以及转换为基本数字类型的几个方法(包括byteValue、shortValue、intValue、longValue、floatValue、doubleValue等)。当然BigInteger要处理的可是超大整数,故而它的用法还是与Integer有所区别的,接下来一一介绍BigInteger特别的地方。

首先是如何对一个大整数变量进行初始化,前面介绍Integer的时候,提到Java代码有三种给包装变量赋值的方式,分别是使用等号直接赋给具体数字、调用valueOf方法进行赋值、通过关键字new创建指定数字的包装变量。然而到了大整数BigInteger这里,三种方式只剩下valueOf方法能够对大整数变量初始化。

其次,包装变量允许使用“+”、“-”、“*”、“/”、“%”等运算符进行四则运算,到了大整数变量这里却不能使用算术运算符,而要通过专门的计算方法才能开展运算。具体说来,大整数类型使用add方法取代了加法运算符“+”,使用subtract方法取代了减法运算符“-”,使用multiply方法取代了乘法运算符“*”,使用divide方法取代了除法运算符“/”,使用remainder方法取代了取余数运算符“%”,使用negate方法取代了负号运算符“-”,这些新方法的调用代码示例如下:

// 生成一个指定数值的大整数变量

BigInteger nine = BigInteger.valueOf(9);

BigInteger four = BigInteger.valueOf(4);

// add方法用来替代加法运算符“+”

BigInteger sum = nine.add(four);

System.out.println("sum="+sum);

// subtract方法用来替代减法运算符“-”

BigInteger sub = nine.subtract(four);

System.out.println("sub="+sub);

// multiply方法用来替代乘法运算符“*”

BigInteger mul = nine.multiply(four);

System.out.println("mul="+mul);

// divide方法用来替代除法运算符“/”

BigInteger div = nine.divide(four);

System.out.println("div="+div);

// remainder方法用来替代取余数运算符“%”

BigInteger remainder = nine.remainder(four);

System.out.println("remainder="+remainder);

// negate方法用来替代负号运算符“-”

BigInteger neg = nine.negate();

System.out.println("neg="+neg);

再次,Java虽然提供了常用的数学函数库Math,但是Math库只能操作基本数字类型的变量,不能操作大数字类型的变量。因而BigInteger另外提供了abs方法和pow方法,分别用于求大数字变量的绝对值,以及求大数字变量的N次方。下面是大整数类型BigInteger调用这两个方法的代码例子:

// abs方法用来替代数学库函数Math.abs

BigInteger abs = nine.abs();

System.out.println("abs="+abs);

// pow方法用来替代数学库函数Math.pow

BigInteger pow = nine.pow(2);

System.out.println("pow="+pow);

总结一下,包装数字类型相比基本数字类型,表达的数值范围并没有扩大,仅仅是调用方式上有所区别,可谓是换汤不换药。而大数字类型真正解决了数值范围的表达限制,并且完全取消了带有明显数学印记的算术运算符,这才形成了面向方法而非面向运算的编程风格。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值