`
haowenxin
  • 浏览: 4509 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
最近访客 更多访客>>
社区版块
存档分类
最新评论

BigInteger与BigDecimal

阅读更多

从之前的浮点数运算 中我们知道,浮点数运算会使结果不精确,且存储值越大,损失的精度也就越大。在通常情况下,long与double类型已经可以满足我们的要求了,但是对于一些要求精确计算结果的行业(如银行)来说,误差就太大了。
幸运的是,Java提供了BigInteger与BigDecimal两个类,使用这两个类可以处理任意精度的数值,这两个类位于java.math包 中。其中BigInteger可以对任意精度的整数进行运算,BigDecial可以对任意精度的小数进行运算。BigDecimal的构造器有很多,但 是常用的是带String参数的构造器:public BigDecimal(String val),建议不要使用带double参数的构造器:public BigDecimal(double val),因为double参数的构造器是不精确的,下例可以说明这个问题。
public class ConstructorTest {
public static void main(String[] args) {
BigDecimal bstring=new BigDecimal(“0.7″);
BigDecimal bdouble=new BigDecimal(0.7);
System.out.println(“String参数结果:”+bstring);
System.out.println(“double参数结果:”+bdouble);
}
}
输出结果:
String参数结果:0.7
double参数结果:0.6999999999999999555910790149937383830547332763671875
显然,String参数的构造器是准确的,而double参数的构造器只是输出了近似的结果,因为是以double类型传入0.7的时候,0.7在计算机中不能精确地表示出来。
现在我们来看看这两个类的使用,这里只是简单的演示,要了解更详细的信息,可以查阅javaAPI文档。
public class BigNumberTest{
public static void main(String[] args) {
//BigInteger的运算
BigInteger bi1=new BigInteger(“12345678901234567890″);
BigInteger bi2=new BigInteger(“98765432109876543210″);
System.out.println(“*******BigInteger的运算*********”);
System.out.println(“bi1+bi2=”+bi1.add(bi2));
System.out.println(“bi1-bi2=”+bi1.subtract(bi2));
System.out.println(“bi1*bi2=”+bi1.multiply(bi2));
System.out.println(“bi1/bi2=”+bi1.divide(bi2));
System.out.println(“bi1%bi2=”+bi1.remainder(bi2));
//BigDecimal的运算
BigDecimal bd1=new BigDecima(“1.23456789012345678901″);
BigDecimal bd2=new BigDecima(“9.87654321098765432109″);
System.out.println(“********BigDecimal的运算*******”);
System.out.println(“bd1+bd2=”+bd1.add(bd2));
System.out.println(“bd1-bd2=”+bd1.subtract(bd2));
System.out.println(“bd1*bd2=”+bd1.multiply(bd2));
//System.out.println(“bd1/bd2=”+bd1.divide(bd2));
System.out.println(“bd1/bd2=”+bd1.divide(bd2,MathContext.DECIMAL128));
System.out.println(“bd1%bd2=”+bd1.remainder(bd2));
}
}
运行结果:
*********BigInteger的运算*********
bi1+bi2=111111111011111111100
bi1-bi2=-86419753208641975320
bi1*bi2=1219326311370217952237463801111263526900
bi1/bi2=0
bi1%bi2=12345678901234567890
*********BigDecimal的运算*********
bd1+bd2=11.11111110111111111010
bd1-bd2=-8.64197532086419753208
bd1*bd2=12.1932631137021795225845145533336229232209
bd1/bd2=0.1249999988609375000141117187602160
bd1%bd2=1.23456789012345678901
可以看出,尽管在程序中指定了相当大的整数和小数,但结果依然没有精度丢失。但是这种计算方式也给编程带来了额外的工作量,运行速度也远不及基本数据类型,所以要谨慎使用。
上面程序标为注释的一行中,BigDecimal类中的方法:public BigDecimal divide(BigDecimal divisor)如果因为存在无穷的十进制扩展(如10除以7的商值)导致无法准确表示商值得结果,则抛出ArithmeticException。而上 面程序标为注释的一行就是一个无穷小数,就会抛出异常。所以这里采用的重载的方法:
public BigDecimal divide(BigDecimal divisor,MathContext mc)其中mc参数指定对商的舍入模式,程序中采用精度较高的IEEE 754R BigDecimal128模式。
我们要对数据进行精确的计算时,还是要看情况来选择使用什么类型来确保结果的准确性,一般考虑使用long类型来取代浮点类型,来确保结果的准确性,必要 时可使用BigInteger与BigDecimal,但是这两个类的性能消耗较大,得看具体情况谨慎使用。本文转载来自八零客团队博客80客 团队成员的文章http://www.balingke.com/archives/741.html

分享到:
评论

相关推荐

    java-BigInteger-BigDecimal类源码

    3. **运算符重载**:`BigDecimal`提供了与`BigInteger`类似的算术操作,但还包括了除法、比较和舍入操作。它还支持`add()`, `subtract()`, `multiply()`, `divide()`, `divideToIntegralValue()`等方法。 4. **舍入...

    BigInteger和BigDecimal

    BigInteger和BigDecimal

    java笔试题算法-DelphiBigNumbers:Delphi的BigInteger和BigDecimal

    BigInteger、BigDecimal 和 BigRational 这些是多精度BigInteger 、 BigDecimal和BigRational类型的实现,从头开始构建。 大整数 BigInteger是一个多精度整数。 它的大小仅受可用内存的限制。 BigInteger是为易用性...

    Java中的BigInteger类与BigDecimal类,细解,带例题

    BigInteger (大整数类) 使用时导包:java.math.BigInteger 作用:可以使用BigInteger操作大整数,也可以转换进制。如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以...

    BigInteger BigDecimal 使用

    在Java编程语言中,`BigInteger`和`BigDecimal`是两个重要的类,用于处理大整数和高精度浮点数运算。这两个类属于`java.math`包,为开发者提供了超越普通`int`、`long`以及`float`和`double`类型的数值计算能力。 `...

    BigNumerics:BigInteger,BigDecimal和BigFloat。-开源

    与Java或.NET中的double类型不同,BigDecimal不涉及舍入误差,因此特别适合进行财务计算。 3. BigFloat:这是一个专门处理高精度浮点数的数据类型,类似于BigDecimal,但通常更适用于科学计算。它能够在保持精度的...

    redscale:用于 JavaScriptClojureScript 的 BigInteger、BigDecimal 和 Ratio 库

    Ratio对象可以存储两个整数的比率,支持常见的数学运算,并且可以与BigInteger和BigDecimal对象进行转换,使得在处理各种类型的数字时具有更大的灵活性。 **ClojureScript兼容性** 除了JavaScript,红鳞库还支持...

    JavaSE(下).pdf1111

    * System 类、Math 类、BigInteger 与 BigDecimal 3. 枚举类与注解(364-371页) * 枚举类的使用 * 注解 (Annotation) 4. Java 集合(380-440页) * Java 集合框架概述 * Collection 接口方法 * Iterator 迭代器...

    javabiginteger源码-bigdecimal.js:任意精度JavascriptBigInteger和BigDecimal实数

    java biginteger源码用于 JavaScript 的 BigDecimal BigDecimal for Javascript是不可变、任意精度、有符号十进制数的纯 Javascript 实现。...BigDecimal 支持任意精度的十进制数学。...它与 Java 1.5 BigIntege

    java语言程序设计 java编程基础入门教程资料 (1)JAVA语言程序设计 共19页.pptx

    - **BigInteger与BigDecimal类**:用于处理大数值运算。 #### 七、Java容器类 - **集合框架**:Java集合框架主要包括List、Set、Map等接口及其具体实现类。 - **List**:有序集合,允许重复元素,主要实现有...

    BigDecimal 加减乘除运算

    Java中BigInteger的数学运算,BigDecimal 加减乘除运算,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大...

    将 BigDecimal 类型转换为 Integer 类型.pdf

    使用 `toBigInteger()` 方法将 BigDecimal 转换为 BigInteger,然后可以安全地调用 `intValueExact()` 方法,该方法会在值超出 Integer 范围时抛出异常。 4. **其他转换方法** 除了 `intValue()` 和 `...

    BigDecimal向Double转换

    然而,在某些情况下,我们可能需要将BigDecimal类型的值转换为Double类型,比如为了与一些只接受基本数据类型或其包装类的方法参数兼容,或者进行一些基于Double的数学运算等。本文将详细介绍如何在Java中实现...

    java.math.BigDecimal 操作类

    java.math.BigDecimal 操作类,包含加减乘除、String型加减乘除精度格式化转换计算等

    day13_API-异常.pdf

    Java 中的 Math、BigInteger 和 BigDecimal 类 Java 语言中提供了多种数学类来帮助开发者进行数学运算,包括 Math、BigInteger 和 BigDecimal 类。这些类提供了丰富的数学方法,帮助开发者快速高效地进行数学运算。...

    关于Biginteger的分数类期末课程设计

    BigInteger支持的基本操作包括加法、减法、乘法、除法以及各种位操作,如位移、按位与、按位或、按位异或等。它还提供了比较操作,可以用来比较两个BigInteger对象的大小。 在设计分数类时,你需要考虑以下几点: ...

    JAVA11培训课堂 2020版 部分笔记.doc

    与BigInteger不同,BigDecimal的除法需要指定`RoundingMode`,以决定如何处理除不尽的情况。在例子中使用了`HALF_UP`,即四舍五入到最接近的数字。 除了大数字操作,Java还提供了一些工具库类,例如Arrays类,它是...

    Java Bigdecimal使用原理详解

    Java Bigdecimal使用原理详解 Java Bigdecimal是Java语言中用于精确计算的类,它可以完善float和double类无法进行精确计算的缺憾。BigDecimal类位于java.math类包下,提供了多种构造函数和方法来实现精确计算。 ...

    BigDecimal计算

    1. **构造方法**:`BigDecimal`可以通过字符串、整数、长整数或`BigInteger`实例来创建。例如,`new BigDecimal("123.45")`或`new BigDecimal(12345)`。 2. **基本运算**:`BigDecimal`支持加法(`add()`), 减法(`...

Global site tag (gtag.js) - Google Analytics