热门标签 | 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可以指定好四舍五入的精确位置。


推荐阅读
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 最详尽的4K技术科普
    什么是4K?4K是一个分辨率的范畴,即40962160的像素分辨率,一般用于专业设备居多,目前家庭用的设备,如 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Maven Web项目创建时JSP文件常见错误及解决方案
    Maven Web项目创建时JSP文件常见错误及解决方案 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 在iOS开发中,`UIScrollView` 的滚动条显示与隐藏由两个关键属性控制,默认情况下,滚动条会在滚动时短暂显示,然后自动消失。通过设置 `showsHorizontalScrollIndicator` 和 `showsVerticalScrollIndicator` 属性为 `YES` 或 `NO`,可以强制始终显示或隐藏水平和垂直滚动条。此外,还可以通过 `indicatorStyle` 属性调整滚动条的样式,以适应不同的界面需求。这些属性的灵活运用能够显著提升用户体验。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
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社区 版权所有