当前位置:首页 > Java技术 > 大数处理类BigInteger和BigDecimal浅谈

大数处理类BigInteger和BigDecimal浅谈

2022年08月05日 22:58:54Java技术9

这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal;

BigInteger和BigDecimal分别表示不可变的任意精度的整数和不可变的有符号的任意精度的十进制数(浮点数)。主要用于高精度计算中。这两个类使得java中的大数,高精度运算变得很简单。

下面从几个方面对BigInteger和BigDecima做一个简单的比较:

 

一.常量

BigInteger:ONE,ZERO,TEN分别代表1,0,10.

其定义类似于:public static final BigInteger ONE = valueOf(1);

BigDecimal:除了以上三个常量外还有8个关于舍入的常量,这里不再赘述,可以去查看API的帮助手册.

顺便说一句,BigDecimal由于舍入模式的存在,使得这个类用起来比BigInteger要复杂.这里不再赘述,具体可以查看API的帮助手册,但是平时对起复杂特性用的不多,所以用的时候查阅API也是可行的.

 

二.声明赋值

BigInteger:BigInteger bi = new BigInteger("100");或:BigInteger bi = BigInteger.valueOf(100);

数组定义与基本类型类似.

BigDecimal:BigDecimal bd = new BigDecimal(100);或:BigDecimal bd = BigDecimal.valueOf(100);

BigDecimal的构造函数比BigInteger多一些,感觉用起来更方便些,比如这样定义就是错误的:BigInteger bi = new BigInteger(100);

顺便说一下,java.util包中的Scanner类实现了nextBigInteger()和nextBigDecimal()方法,可以用来读入控制台输入的BigInteger和BigDecimal.给个例子:

 

Java代码   收藏代码
  1. Scanner sc = new Scanner(System.in);  
  2. while(sc.hasNext()){  
  3.     BigInteger bi;  
  4.     //BigDecimal bd;  
  5.     bi = sc.nextBigInteger();//读入BigInteger  
  6.     // bd = sc.nextBigDecimal();//读入BigDecimal  
  7.     System.out.println(bi.toString());  
  8.     //System.out.println(bd.toString());  
  9. }  
 

 

 

三.相关函数

主要介绍一下四则运算等函数:

用两个例子来说明比较直观一些:

BigInteger:

 

Java代码   收藏代码
  1. package Factorial;  
  2.   
  3. import java.math.BigInteger;  
  4. import java.util.Random;  
  5. /** 
  6.  * 测试BigInteger类的一些函数 
  7.  * @author LY 2011-10-27 
  8.  * */  
  9. public class BigIntegerDemo {  
  10.     public static void main(String[] arguments){  
  11.         System.out.println("构造两个BigInteger对象: ");  
  12.         //BigInteger(int numBits, Random rnd)   
  13.         //构造一个随机生成的 BigInteger,它是在 0 到 (2^numBits - 1)(包括)范围内均匀分布的值  
  14.         BigInteger bi1 =  new BigInteger(55,new Random());  
  15.         System.out.println("bi1 = " + bi1);  
  16.           
  17.         //BigInteger(byte[] val)   
  18.         //将包含 BigInteger 的二进制补码表示形式的 byte 数组转换为 BigInteger。  
  19.         BigInteger bi2 = new BigInteger(new byte[]{ 3,2,3});  
  20.         System.out.println("bi2 = " + bi2);  
  21.           
  22.         //加  
  23.         System.out.println("bi1 + bi2 = " + bi1.add(bi2));  
  24.         //减  
  25.         System.out.println("bi1 - bi2 = " + bi1.subtract(bi2));  
  26.         //乘  
  27.         System.out.println("bi1 * bi2 = " + bi1.multiply(bi2));  
  28.         //指数运算  
  29.         System.out.println("bi1的2次方 = " + bi1.pow(2));  
  30.         //整数商  
  31.         System.out.println("bi1/bi2的整数商: " + bi1.divide(bi2));  
  32.         //余数  
  33.         System.out.println("bi1/bi2的余数: " + bi1.remainder(bi2));  
  34.         //整数商+余数  
  35.         System.out.println("bi1 / bi2 = " + bi1.divideAndRemainder(bi2)[0] +   
  36.                 "--" + bi1.divideAndRemainder(bi2)[1]);  
  37.         System.out.println("bi1 + bi2 = " + bi1.add(bi2));  
  38.         //比较大小,也可以用max()和min()  
  39.         if(bi1.compareTo(bi2) > 0)  
  40.   
  41.                System.out.println("bd1 is greater than bd2");  
  42.   
  43.            else if(bi1.compareTo(bi2) == 0)  
  44.   
  45.                System.out.println("bd1 is equal to bd2");  
  46.   
  47.            else if(bi1.compareTo(bi2) < 0)  
  48.   
  49.                System.out.println("bd1 is lower than bd2");  
  50.         //返回相反数  
  51.         BigInteger bi3 = bi1.negate();  
  52.         System.out.println("bi1的相反数: " + bi3);  
  53.         //返回绝对值  
  54.         System.out.println("bi1的绝对值:  " + bi3.abs());  
  55.     }  
  56.   
  57. }  

 

运行结果:

 

Java代码   收藏代码
  1. 构造两个BigInteger对象:   
  2. bi1 = 8893838204110884  
  3. bi2 = 197123  
  4. bi1 + bi2 = 8893838204308007  
  5. bi1 - bi2 = 8893838203913761  
  6. bi1 * bi2 = 1753180068308949786732  
  7. bi1的2次方 = 79100358000902314326836967261456  
  8. bi1/bi2的整数商: 45118216565  
  9. bi1/bi2的余数: 168389  
  10. bi1 / bi2 = 45118216565--168389  
  11. bi1 + bi2 = 8893838204308007  
  12. bd1 is greater than bd2  
  13. bi1的相反数: -8893838204110884  
  14. bi1的绝对值:  8893838204110884  

 

BigDecimal:

 

Java代码   收藏代码
  1. package Factorial;  
  2.   
  3. import java.math.BigDecimal;;  
  4. /** 
  5.  * 测试BigDecimal类的一些函数 
  6.  * @author LY 2011-10-27 
  7.  * */  
  8. public class BigDecimalDemo {  
  9.     public static void main(String[] arguments){  
  10.         System.out.println("构造两个BigDecimal对象: ");  
  11.         //用char[]数组创建BigDecimal对象,第二个参数为位移offset,  
  12.         //第三个参数指定长度  
  13.         BigDecimal bd1 = new BigDecimal("3464656776868432998434".toCharArray(),2,15);  
  14.         System.out.println("bd1 = " + bd1);  
  15.         //用double类型创建BigDecimal对象  
  16.         BigDecimal bd2 = new BigDecimal(134258767575867.0F);  
  17.         System.out.println("bd2 = " + bd2);  
  18.           
  19.         //加  
  20.         System.out.println("bd1 + bd2 = " + bd1.add(bd2));  
  21.         //减  
  22.         System.out.println("bd1 - bd2 = " + bd1.subtract(bd2));  
  23.         //乘  
  24.         System.out.println("bd1 * bd2 = " + bd1.multiply(bd2));  
  25.         //指数运算  
  26.         System.out.println("bd1的2次方 = " + bd1.pow(2));  
  27.         //取商的整数部分  
  28.         System.out.println("bd1/bd2的整数商: " + bd1.divideToIntegralValue(bd2));  
  29.         //返回余数计算为:this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))  
  30.         //System.out.println(bd1.subtract(bd1.divideToIntegralValue(bd2).multiply(bd2)));  
  31.         System.out.println("bd1/bd2的余数: " + bd1.remainder(bd2));  
  32.         //取商和余,即bd1.divideToIntegralValue(bd2)与bd1.remainder(bd2)  
  33.         System.out.println("bd1 / bd2 = " + bd1.divideAndRemainder(bd2)[0] +   
  34.                 "--" + bd1.divideAndRemainder(bd2)[1]);  
  35.         //比较大小,也可以用max()和min()  
  36.         if(bd1.compareTo(bd2) > 0)  
  37.   
  38.                System.out.println("bd1 is greater than bd2");  
  39.   
  40.            else if(bd1.compareTo(bd2) == 0)  
  41.   
  42.                System.out.println("bd1 is equal to bd2");  
  43.   
  44.            else if(bd1.compareTo(bd2) < 0)  
  45.   
  46.                System.out.println("bd1 is lower than bd2");  
  47.         //末位数据精度  
  48.         System.out.println("bd1的末位数据精度:  " + bd1.ulp());  
  49.           
  50.     }  
  51.   
  52. }  

 

运行结果:


  1. 构造两个BigDecimal对象:   
  2. bd1 = 646567768684329  
  3. bd2 = 134258765070336  
  4. bd1 + bd2 = 780826533754665  
  5. bd1 - bd2 = 512309003613993  
  6. bd1 * bd2 = 86807390157840676971865964544  
  7. bd1的2次方 = 418049879501431972683650180241  
  8. bd1/bd2的整数商: 4  
  9. bd1/bd2的余数: 109532708402985  
  10. bd1 / bd2 = 4--109532708402985  
  11. bd1 is greater than bd2  
  12. bd1的末位数据精度:  1  

 

作者:零点起航
来源链接:https://blog.csdn.net/csyuyaoxiadn/article/details/7907031

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/17689.html

标签: BigDecimal
分享给朋友:

“大数处理类BigInteger和BigDecimal浅谈” 的相关文章

java.math.BigDecimal常用方法

+构造函数 BigDecimal(BigInteger val) 将BigInteger转化为BigDecimal。 BigDecimal(BigInteger unscaledVal, int scale) 将B...

Java 使用BigDecimal进行高精度加减乘除

有时候我们计算金钱或者其他一些计算的时候需要高精度的计算加减乘除,可以使用BigDecimal 加: BigDecimal num1 = new BigDecimal("100.569"); BigDecimal num2 = new Big...

[转]BigDecimal使用(整理)

原文地址:https://www.jianshu.com/p/2947868d76eb 应用场景 大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。比如:货币 使用 1、构建BigDecima...

Java:利用BigDecimal类巧妙处理Double类型精度丢失

Java:利用BigDecimal类巧妙处理Double类型精度丢失

文章目录 本篇要点 经典问题:浮点数精度丢失 十进制整数如何转化为二进制整数? 十进制小数如何转化为二进制数?...

BigDecimal 与 doubleValue 的使用 ,以及四舍五入

/** * 保存发票信息 * @param controller * @return * @throws ParseException * @throws ActiveRecordException */ @...

BigDecimal转为int类型

BigDecimal转为int类型

直接调用BigDecimal的intValue()方法 示例: BigDecimal a = new BigDecimal(“1.1”); int b = a.intValue(); BigDecimal运算方法:...

JDK中BigDecimal的代码实现

package java.math; import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.PrintStream;...

Java BigDecimal

1构造函数(主要测试参数类型为double和String的两个常用构造函数)        BigDecimal aDouble =new BigDecimal(1.22);  &nb...

【java提高】(19)---BigDecimal详解和精度问题

【java提高】(19)---BigDecimal详解和精度问题

BigDecimal详解和精度问题 一、背景 在实际开发中,对于 不需要任何准确计算精度的属性可以直接使用float或double,但是如果需要精确计算结果,则必须使用BigDecimal,例如价格、质量。 为什么这么说,主要有两点...

BigDecimal<转载>

前言 我们都知道浮点型变量在进行计算的时候会出现丢失精度的问题。如下一段代码: System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.42); System.out.printl...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。