`

BigInteger与BigDecimal

    博客分类:
  • JAVA
阅读更多

Java 提供了两个类专门用于进行高精度运算BigInteger 和 BigDecimal ,尽管它们可大致划分到与封装器相同的类别里,但两者都没有对应的主类型;这两个类都有自己的一系列方法,类似于我们针对主类型执行的操作,也就是说能用 int 或float 做的事情,用BigInteger和BigDecimal 一样可以做,只是必须换用方法调用,而不是使用运算符。此外由于牵涉更多,所以运算速度会慢一点总之我们牺牲了速度,但换来了精度。

高精度浮点数BigDecimal

一些非整数值(如几美元和几美分这样的小数)需要很精确。浮点数不是精确值,所以使用它们会导致舍入误差。因此,使用浮点数来试图表示象货币量这样的精确 数量不是一个好的想法。使用浮点数来进行美元和美分计算会得到灾难性的后果。浮点数最好用来表示象测量值这类数值,这类值从一开始就不怎么精确。
    从 JDK 1.3 起,Java 开发人员就有了另一种数值表示法来表示非整数:BigDecimal。BigDecimal 是标准的类,在编译器中不需要特殊支持,它可以表示任意精度的小数,并对它们进行计算。在内部,可以用任意精度任何范围的值和一个换算因子来表示 BigDecimal,换算因子表示左移小数点多少位,从而得到所期望范围内的值。因此,用 BigDecimal 表示的数的形式为 unscaledValue*10-scale。
  用于加、减、乘和除的方法给  BigDecimal 值提供了算术运算。由于 BigDecimal 对象是不可变的,这些方法中的每一个都会产生新的 BigDecimal 对象。因此,因为创建对象的开销,BigDecimal 不适合于大量的数学计算,但设计它的目的是用来精确地表示小数。如果您正在寻找一种能精确表示如货币量这样的数值,则 BigDecimal 可以很好地胜任该任务。
  如浮点类型一样,BigDecimal 也有一些令人奇怪的行为。尤其在使用 equals() 方法来检测数值之间是否相等时要小心。equals() 方法认为,两个表示同一个数但换算值不同(例如,100.00 和  100.000)的 BigDecimal 值是不相等的。然而,compareTo() 方法会认为这两个数是相等的,所以在从数值上比较两个  BigDecimal 值时,应该使用 compareTo() 而不是 equals()。
  另外还有一些情形,任意精度的小数运算仍不能表示精确结果。例如,1 除以 9 会产生无限循环的小数 .111111...。出于这个原因,在进行除法运算时,BigDecimal 可以让您显式地控制舍入。movePointLeft() 方法支持 10 的幂次方的精确除法。
  对于 BigDecimal,有几个可用的构造函数。其中一个构造函数以双精度浮点数作为输入,另一个以整数和换算因子作为输入,还有一个以小数的 String 表示作为输入。要小心使用  BigDecimal(double) 构造函数, 因为如果不了解它,会在计算过程中产生舍入误差。请使用基于整数或 String 的构造函数。
如果使用 BigDecimal(double) 构造函数不恰当,在传递给 JDBC setBigDecimal() 方法时,会造成似乎很奇怪的 JDBC 驱动程序中的异常。例如,考虑以下 JDBC 代码,该代码希望将数字 0.01 存储到小数字段:
  PreparedStatement ps =connection.prepareStatement("INSERT INTO Foo SET name=?, value=?");
  ps.setString(1, "penny");
  ps.setBigDecimal(2, new BigDecimal(0.01));
  ps.executeUpdate();
     在执行这段似乎无害的代码时会抛出一些令人迷惑不解的异常(这取决于具体的 JDBC 驱动程序),因为 0.01 的双精度近似值会导致大的换算值,这可能会使 JDBC 驱动程序或数据库感到迷惑。JDBC 驱动程序会产生异常,但可能不会说明代码实际上错在哪里,除非意识到二进制浮点数的局限性。相反,使用 BigDecimal("0.01") 或 BigDecimal(1, 2) 构造 BigDecimal 来避免这类问题, 因为这两种方法都可以精确地表示小数。

import java.math.BigDecimal;
/** * *
* <p>Title: 开源,开放</p>
* * <p>Description: opeansource</p>
* * <p>Copyright: Copyright (c) 2004</p>
* * <p>Company: ?海棠</p>
* * @author HaiTang Ming
* * @version 1.0 */
public class BigDecimalUtil {  
//默认除法运算精度,及即保留小数点多少位  
private static final int DEF_DIV_SCALE = 2;  
//这个类不能实例化  
private BigDecimalUtil (){   }  
/**    
  * * 提供精确的加法运算。    
  * * @param v1 被加数    
  * * @param v2 加数    
  * * @return 两个参数的和    
  * */  
public static double add(double v1,double v2){    
  BigDecimal b1 = new BigDecimal(Double.toString(v1));    
  BigDecimal b2 = new BigDecimal(Double.toString(v2));    
  return (b1.add(b2)).doubleValue();  
}  

/**

  *提供精确的减法运算。  
  * * @param v1 被减数  
  * * @param v2 减数  
  * * @return 两个参数的差
  **/  
public static double sub(double v1,double v2){    
  BigDecimal b1 = new BigDecimal(Double.toString(v1));    
  BigDecimal b2 = new BigDecimal(Double.toString(v2));    
  return (b1.subtract(b2)).doubleValue();  
}  
/**    
  * * 提供精确的乘法运算。    
  * * @param v1 被乘数    
  * * @param v2 乘数    
  * * @return 两个参数的积    
  * */
public static double mul(double v1,double v2){    
  BigDecimal b1 = new BigDecimal(Double.toString(v1));    
  BigDecimal b2 = new BigDecimal(Double.toString(v2));    
  return (b1.multiply(b2)).doubleValue();  
}  
/**    
  * * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到    
  * * 小数点以后多少位,以后的数字四舍五入。    
  * * @param v1 被除数    
  * * @param v2 除数    
  * * @return 两个参数的商    
  * */  
public static double div(double v1,double v2){    
  return div(v1,v2,DEF_DIV_SCALE);  
}  
/**    
  * * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指    
  * * 定精度,以后的数字四舍五入。    
  * * @param v1 被除数  
  * @param v2 除数    
  * * @param scale 表示表示需要精确到小数点以后几位。    
  * * @return 两个参数的商    
  * */  
public static double div(double v1,double v2,int scale){    
  if(scale<0){      
   throw new IllegalArgumentException("The scale must be a positive integer or zero");    
  }    
  BigDecimal b1 = new BigDecimal(Double.toString(v1));    
  BigDecimal b2 = new BigDecimal(Double.toString(v2));    
  return (b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP)).doubleValue();  
}  
/**    
  * * 提供精确的小数位四舍五入处理。    
  * * @param v 需要四舍五入的数字    
  * * @param scale 小数点后保留几位    
  * * @return 四舍五入后的结果    
  * */  
public static double round(double v,int scale){  
  if(scale<0){      
   throw new IllegalArgumentException("The scale must be a positive integer or zero");
  }    
  BigDecimal b = new BigDecimal(Double.toString(v));    
  BigDecimal one = new BigDecimal("1");    
  return (b.divide(one,scale,BigDecimal.ROUND_HALF_UP)).doubleValue();  
}    
public static void main(String[] args){    
  System.out.println(add(234.44,534.90));
  
  double a = 123.345678;    
  double d = round(a,2);    
  System.out.println("round("+a+",2)--->"+d);  
}
}

 高精度整数BigInteger

BigInteger支持任意精度的整数,也就是说我们可精确表示任意大小的整数值;同时在运算过程中不会丢失任何信息;
在BigInteger类中有所有的基本算术运算方法,如加、减、乘、除,以及可能会用到的位运算如或、异或、非、左移、右移等。下面是一些方法的例子:当然,如果要有更多的使用方法,可以查阅java api 。

public class BigIntegerTest {  
public BigIntegerTest() {   }  
/**    
  * * 测试BigInteger
  * */  
public static void testBigInteger() {    
  BigInteger bi = new BigInteger("888");    
  //multiply :乘法    
  BigInteger result = bi.multiply(new BigInteger("2"));    
  System.out.println(result);    
  //divide : 除法    
  result = bi.divide(new BigInteger("2"));    
  System.out.println(result);    
  //add : 加法    
  result = bi.add(new BigInteger("232"));    
  System.out.println(result);    
  //subtract :减法    
  result = bi.subtract(new BigInteger("23122"));    
  System.out.println(result);    
  result = bi.shiftRight(2);    
  System.out.println(result);  
}    
public static void main(String[] args) {    
  testBigInteger();  
}
}

 本文来自于:http://dev.firnow.com/course/3_program/java/javaxl/2008914/142796_2.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