热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java中处理大数据问题(BigInteger、BigDecimal)

原文转自:https:blog.csdn.netzhongkeleearticledetails52289163;http:www.cnblogs.c
原文转自:https://blog.csdn.net/zhongkelee/article/details/52289163;

 http://www.cnblogs.com/chenssy/ 

适用范围

使用BigInteger操作大整数(处理超出long整型范围的数据)
使用BigDecimal指定小数的保留位数

基础知识

对于二进制来说,最高位代表正负号,-0表示-128,+0表示0
32位系统int型4个字节:-(2的31次方) ~ (2的31次方) 减 1
最大负数:10000000 00000000 00000000 00000000
最大正数:01111111 11111111 11111111 11111111
0:                 00000000 00000000 00000000 00000000

64位系统同理,int型表示范围是:-(2的63次方) ~ (2的63次方) 减 1


具体内容

大数操作

正常情况下一个整数最多只能放在long类型之中,但是如果现在有如下的一个数字:
        1111111111111111111111111111111111111111111111111
根本就是无法保存的,所以为了解决这样的问题,在java中引入了两个大数的操作类:
        操作整型:BigInteger
        操作小数:BigDecimal
当然了,这些大数都会以字符串的形式传入。

BigInteger

        如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作。


        BigInteger是在java.math包中。

代码示例:

[java]  view plain  copy
  1. package ustc.lichunchun.bigdataapi;  
  2.   
  3. import java.math.BigInteger;  
  4.   
  5. public class BigIntegerDemo1 {  
  6.   
  7.     public static void main(String[] args) {  
  8.         BigInteger bi1 = new BigInteger("123456789") ;  // 声明BigInteger对象  
  9.         BigInteger bi2 = new BigInteger("987654321") ;  // 声明BigInteger对象  
  10.         System.out.println("加法操作:" + bi2.add(bi1)) ;    // 加法操作  
  11.         System.out.println("减法操作:" + bi2.subtract(bi1)) ;   // 减法操作  
  12.         System.out.println("乘法操作:" + bi2.multiply(bi1)) ;   // 乘法操作  
  13.         System.out.println("除法操作:" + bi2.divide(bi1)) ; // 除法操作  
  14.         System.out.println("最大数:" + bi2.max(bi1)) ;  // 求出最大数  
  15.         System.out.println("最小数:" + bi2.min(bi1)) ;  // 求出最小数  
  16.         BigInteger result[] = bi2.divideAndRemainder(bi1) ; // 求出余数的除法操作  
  17.         System.out.println("商是:" + result[0] +   
  18.             ";余数是:" + result[1]) ;  
  19.     }  
  20. }  

发现divide()方法本身只是把最终的商保存下来了,但是这样的两个数字相除的时候肯定是无法整除,肯定存在余数,所以我们在上面代码中还用到了divideAndRemainder()方法来获得结果和余数。

BigDecimal

首先我们先来看如下代码示例:

1 public class Test_1 {
2     public static void main(String[] args) {
3         System.out.println(0.06+0.01);
4         System.out.println(1.0-0.42);
5         System.out.println(4.015*100);
6         System.out.println(303.1/1000);
7     }
8     
9 }

          运行结果如下。

         0.06999999999999999

         0.5800000000000001

         401.49999999999994

         0.30310000000000004

         你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。

          其实javafloat只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。

          在使用BigDecimal类来进行计算的时候,主要分为以下步骤:

              1、用float或者double变量构建BigDecimal对象。

             2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。

             3、把BigDecimal对象转换成floatdoubleint等类型。

          一般来说,可以使用BigDecimal的构造方法或者静态方法的valueOf()方法把基本类型的变量构建成BigDecimal对象。

1 BigDecimal b1 = new BigDecimal(Double.toString(0.48));
2 BigDecimal b2 = BigDecimal.valueOf(0.48);

        对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法。

1 public BigDecimal add(BigDecimal value);                        //加法
2 public BigDecimal subtract(BigDecimal value);                   //减法 
3 public BigDecimal multiply(BigDecimal value);                   //乘法
4 public BigDecimal divide(BigDecimal value);                     //除法


     进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue()doubleValue()等方法。

        使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。
        对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。


代码示例:

[java]  view plain  copy
  1. package ustc.lichunchun.bigdataapi;  
  2.   
  3. import java.math.BigDecimal;  
  4.   
  5. public class BigDecimalDemo01 {  
  6.   
  7.     public static void main(String[] args) {  
  8.         System.out.println("加法运算:" + MyMath.round(MyMath.add(10.345,3.333),1)) ;  
  9.         System.out.println("减法运算:" + MyMath.round(MyMath.sub(10.345,3.333),3)) ;  
  10.         System.out.println("乘法运算:" + MyMath.round(MyMath.mul(10.345,3.333),4)) ;  
  11.         System.out.println("除法运算:" + MyMath.div(10.345,3.333,3)) ;  
  12.     }  
  13. }  
  14. class MyMath{  
  15.     public static double add(double d1,double d2){      // 进行加法计算  
  16.         BigDecimal b1 = new BigDecimal(d1) ;  
  17.         BigDecimal b2 = new BigDecimal(d2) ;  
  18.         return b1.add(b2).doubleValue() ;  
  19.     }  
  20.     public static double sub(double d1,double d2){      // 进行减法计算  
  21.         BigDecimal b1 = new BigDecimal(d1) ;  
  22.         BigDecimal b2 = new BigDecimal(d2) ;  
  23.         return b1.subtract(b2).doubleValue() ;  
  24.     }  
  25.     public static double mul(double d1,double d2){      // 进行乘法计算  
  26.         BigDecimal b1 = new BigDecimal(d1) ;  
  27.         BigDecimal b2 = new BigDecimal(d2) ;  
  28.         return b1.multiply(b2).doubleValue() ;  
  29.     }  
  30.     public static double div(double d1,double d2,int len){      // 进行除法计算  
  31.         BigDecimal b1 = new BigDecimal(d1) ;  
  32.         BigDecimal b2 = new BigDecimal(d2) ;  
  33.         return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;  
  34.     }  
  35.     public static double round(double d,int len){   // 进行四舍五入  
  36.         BigDecimal b1 = new BigDecimal(d) ;  
  37.         BigDecimal b2 = new BigDecimal(1) ; // 技巧  
  38.         return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;  
  39.     }  
  40. };  

提示:

1、一般在开发中很少遇到大数字的操作情况。
2、使用BigDecimal可以指定好四舍五入的精确位置。


推荐阅读
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • IntegertoRomanGivenaninteger,convertittoaromannumeral.Thenumberisguarant ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • Integer类基本类型int的封装类,是不可变类。该类提供了很多与int相互转换的方法。int类型32位,因此它有最小值(-2^31-2147483648)和最大值(2^31-1 ... [详细]
author-avatar
谢丹逝梦
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有