第一部分:

这两个类位于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.给个例子:

  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:

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

运行结果:

  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:

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

运行结果:

  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

本文对BigInteger和BigDecimal类进行了比较浅显的介绍及比较,如对这两个类有兴趣,可以查阅API或研读其源码.

---恢复内容结束---

这两个类位于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.给个例子:

  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:

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

运行结果:

  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:

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

运行结果:

  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

本文对BigInteger和BigDecimal类进行了比较浅显的介绍及比较,如对这两个类有兴趣,可以查阅API或研读其源码.

第二部分:

BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是 (unscaledValue × 10-scale)。

可以处理任意长度的浮点数运算。

BigDecimal add(BigDecimal val) //BigDecimal 加法

BigDecimal subtract (BigDecimal val) //BigDecimal 减法

BigDecimal multiply (BigDecimal val)  //BigDecimal 乘法

BigDecimal divide (BigDecimal val,RoundingMode mode)  除法

具体使用 计算:

   
  加:   a.add(b);

  减: a.subtract(b);

  乘:   a.multiply(b);

  除:   a.divide(b,2);//2为精度取值 
除法细解: 
  //注意以下相除会抛出异常,原因: 通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常  
        //BigDecimal divideBg = a.divide(b);   
        //解决方法是:设置精确度;就是给divide设置精确的小数点 
divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN)   
        //其中的第二个参数表示的是:保留小数点之后多少位

BigDecimal不整除抛出的异常,请设置精确度! 
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 
at java.math.BigDecimal.divide(BigDecimal.java:1278) 
at main.Main.main(Main.java:41)

下面我们来看看除法的详细说明: 
   divide(BigDecimal divisor, int scale, introundingMode)

BigDecimal的setScale方法

BigDecimal.setScale()

方法用于格式化小数点

表示保留一位小数,默认用四舍五入方式

setScale(1)

直接删除多余的小数位,如2.35会变成2.3 setScale(1,BigDecimal.ROUND_DOWN)

进位处理,2.35变成2.4  setScale(1,BigDecimal.ROUND_UP)

四舍五入,2.35变成2.4  setScale(1,BigDecimal.ROUND_HALF_UP)

四舍五入,2.35变成2.3,如果是5则向下舍setScaler(1,BigDecimal.ROUND_HALF_DOWN)

注意点一

scale指的是你小数点后的位数。 
scale()就是BigDecimal类中的方法。如

BigDecimal b = new BigDecimal("123.456");

b.scale()返回的就是3 
注意点二roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段,

有很多种,如 
BigDecimal.ROUND_HALF_UP表示的就是4舍5入

注意点三

divide(BigDecimal divisor, int scale, introundingMode)的意思是说: 
我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式是什么,是四舍五入啊还是其它的

BigDecimal aa = new  BigDecimal(135.95 );

BigDecimal bb=new  BigDecimal("100" );

BigDecimal result=aa.multiply(bb);  //做加法

3.java中 BigDecimal类型的可以转换到double类型: 
  用 变量.doubleValue();函数  即可将 BigDecimal 类型数据 转化为 double类型! 
4.java BigDecimal比较大小

可以通过BigDecimal的compareTo方法来进行比较。 
返回的结果是int类型,-1表示小于,0是等于,1是大于。

看下面这个例子: 
BigDecimal a = new BigDecimal("1.00"); 
BigDecmial b = new BigDecimal(1);

想比较一下a和b的大小,一般都会用equals

System.out.println(a.equals(b)); 
但是输出结果是:false 
原因是:BigDecimal比较时,不仅比较值,而且还比较精度?

if(a.compareTo(b)==0) 结果是true

比较大小可以用 a.compareTo(b) 
返回值    -1 小于   0 等于    1 大于

5.BigDecimal取其中最大、最小值、绝对值、相反数:

  a.max (b) //比较取最大值

  a.min(b) //比较取最小值

  a.abs()//取最绝对值

  a.negate()//取相反数

6.下面是注意 :

BigDecimal枚举常量用法摘要  :

CEILING   
          向正无限大方向舍入的舍入模式。 
DOWN   
          向零方向舍入的舍入模式。 
FLOOR   
          向负无限大方向舍入的舍入模式。 
HALF_DOWN   
          向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。 
HALF_EVEN   
          向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。 
HALF_UP   
          向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。 
UNNECESSARY   
          用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。 
UP   
          远离零方向舍入的舍入模式。

7.关于BigDecimal格式化

public String formatValue(Object value){ 
        String content = null; 
        if (value == null) { 
             content = ""; 
         } else { 
             if(value instanceof BigDecimal){ 
                 //conver to fortmat String 
                 NumberFormat nf = NumberFormat.getInstance(); 
                 nf.setMinimumFractionDigits(2); 
                 nf.setMaximumFractionDigits(2); 
                 content = nf.format(value);  
             }else{ 
                 content = String.valueOf(value); 
             } 
         } 
        return content; 
    }

使用这样一个方法可以达到格式化的效果,其中value instanceof BigDecimal,表示的是字符类型是BigDecimal类型的时候执行,这里的NumberFormat就表示字符类型,下面的两句代码就表示小数点后面的精确位数。

这里还要提到NumberFormat的其他两个类型:

getCurrencyInstance(): 返回当前默认 环境的货币格式

CurrencyInstance(): 返回指定语言 环境的数字格式,一般是百分比格式

8.在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。 
我们如果需要精确计算,非要用String来够造BigDecimal不可!

下面的这个工具类是是转载别人的,可以通过个工具类实现小数的精确计算。

1import java.math.BigDecimal;   
2/** *//**  
3* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精  
4* 确的浮点数运算,包括加减乘除和四舍五入。  
5*/  
6public class Arith{   
7    //默认除法运算精度   
8    private static final int DEF_DIV_SCALE = 10;   
9    //这个类不能实例化   
10    private Arith(){   
11    }   
12  
13    /** *//**  
14     * 提供精确的加法运算。  
15     * @param v1 被加数  
16     * @param v2 加数  
17     * @return 两个参数的和  
18     */  
19    public static double add(double v1,double v2){   
20        BigDecimal b1 = new BigDecimal(Double.toString(v1));   
21        BigDecimal b2 = new BigDecimal(Double.toString(v2));   
22        return b1.add(b2).doubleValue();   
23    }   
24    /** *//**  
25     * 提供精确的减法运算。  
26     * @param v1 被减数  
27     * @param v2 减数  
28     * @return 两个参数的差  
29     */  
30    public static double sub(double v1,double v2){   
31        BigDecimal b1 = new BigDecimal(Double.toString(v1));   
32        BigDecimal b2 = new BigDecimal(Double.toString(v2));   
33        return b1.subtract(b2).doubleValue();   
34    }    
35    /** *//**  
36     * 提供精确的乘法运算。  
37     * @param v1 被乘数  
38     * @param v2 乘数  
39     * @return 两个参数的积  
40     */  
41    public static double mul(double v1,double v2){   
42        BigDecimal b1 = new BigDecimal(Double.toString(v1));   
43        BigDecimal b2 = new BigDecimal(Double.toString(v2));   
44        return b1.multiply(b2).doubleValue();   
45    }   
46  
47    /** *//**  
48     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到  
49     * 小数点以后10位,以后的数字四舍五入。  
50     * @param v1 被除数  
51     * @param v2 除数  
52     * @return 两个参数的商  
53     */  
54    public static double div(double v1,double v2){   
55        return div(v1,v2,DEF_DIV_SCALE);   
56    }   
57  
58    /** *//**  
59     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指  
60     * 定精度,以后的数字四舍五入。  
61     * @param v1 被除数  
62     * @param v2 除数  
63     * @param scale 表示表示需要精确到小数点以后几位。  
64     * @return 两个参数的商  
65     */  
66    public static double div(double v1,double v2,int scale){   
67        if(scale<0){   
68            throw new IllegalArgumentException(   
69                "The scale must be a positive integer or zero");   
70        }   
71        BigDecimal b1 = new BigDecimal(Double.toString(v1));   
72        BigDecimal b2 = new BigDecimal(Double.toString(v2));   
73        return b1.divid(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
74    }   
75  
76    /** *//**  
77     * 提供精确的小数位四舍五入处理。  
78     * @param v 需要四舍五入的数字  
79     * @param scale 小数点后保留几位  
80     * @return 四舍五入后的结果  
81     */  
82    public static double round(double v,int scale){   
83        if(scale<0){   
84            throw new IllegalArgumentException(   
85                "The scale must be a positive integer or zero");   
86        }   
87        BigDecimal b = new BigDecimal(Double.toString(v));   
88        BigDecimal one = new BigDecimal("1");   
89        return b.divid(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
90     }   
91  }

BIgInteger类和BigDecimal类的理解的更多相关文章

  1. Java学习——BigInteger类和BigDecimal类

    Java学习——BigInteger类和BigDecimal类 摘要:本文主要学习了用于大数字运算的BigInteger类和BigDecimal类. 部分内容来自以下博客: https://www.c ...

  2. 处理数字的类 —— Math类 、 Random类 、 BigDecimal类 与 BigInteger类

    在我们学习C语言时,我们处理数据时要调用很多函数,那么,Java也有很多的方法可以来处理数值的类. 那么,在本篇博文中,本人就来讲解三个用于处理数值的类 -- Math类 . Random类 与 Bi ...

  3. Java大数处理类:BigInteger类和BigDecimal类

    当我们要处理非常大的数据时,平常用的数据类型已不足以表示,在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,这两个类在理论上只要计算机内存足够大就能够表示无线 ...

  4. Java学习笔记26(Math类、Arrays类、BigInteger类、BigDecimal类)

    Math类:数学工具类,做一些数学计算,开方,对数,三角函数等 所有方法都是静态方法,不需要建立对象,直接用类名调用即可 示例: 这里写几个在日常开发中会用到的,比如三角函数之类的平时不会用到,了解即 ...

  5. 用C# BigInteger实现的BigDecimal类,终于可以直接做四则运算了。

    https://code.google.com/p/dotnet-big-decimal/ 这是个BigDecimal类的开源项目,支持Operators +, - and *. 俺给改了改,加上了除 ...

  6. 14-03 java BigInteger类,BigDecimal类,Date类,DateFormat类,Calendar类

    BigInteger类 发 package cn.itcast_01; import java.math.BigInteger; /* * BigInteger:可以让超过Integer范围内的数据进 ...

  7. BigInteger 类 和 BigDecimal 类

    一 .BigInteger BigInteger类在计算和处理任意大小的整数方面是很有用的. BigInteger 任意大的整数,原则上是,只要你的计算机的内存足够大,可以有无限位的. BigInte ...

  8. 算法笔记--java的BigInteger类及BigDecimal类

    引包:import java.math.*; BigInteger类: 可以使用构造方法:public BigInteger(String val),或者valueOf(int)函数,如: BigIn ...

  9. 正则表达式、Calendar类、SimpleDateFormat类、Date类、BigDecimal类、BigInteger类、System类、Random类、Math类(Java基础知识十四)

    1.正则表达式的概述和简单使用 * A:正则表达式(一个字符串,是规则)     * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. * B: ...

随机推荐

  1. 基于superagent 与 cheerio 的node简单爬虫

    最近重新玩起了node,便总结下基本的东西,在本文中通过node的superagent与cheerio来抓取分析网页的数据. 目的  superagent 抓取网页 cheerio 分析网页 准备 N ...

  2. 浅谈K-SVD

    由于工作需要,最近刚刚看了一些K-SVD的介绍,这里给自己做一下小节. K-SVD我们一般是用在字典学习.稀疏编码方面,它可以认为是K-means的一种扩展,http://en.wikipedia.o ...

  3. IOS杂谈

    1 IOS名称是iPhone Operating System 的缩写,原本这个系统名为iPhone OS,意思是iPhone 操作系统. 2 IOS的开发环境是Xcode.Xcode就成为了iPho ...

  4. CAD 快捷键Ctrl+2 Ctrl+3

    今天用cad,学习了两个快捷键,第一个Ctrl+2,打开如下 第二个是Ctrl+3,打开如下:

  5. Log4net源码View之Logger解析

    1.简介 Logger是Log4net的三大核心载体之一,搞清楚它的意义很重大.另外两个分别是Appender和Layout.其对应关系为一个Logger对应多个Appender,一个Appender ...

  6. 奇妙的旅行[XDU1012]

    Problem 1012 - 奇妙的旅行 Time Limit: 1000MS   Memory Limit: 65536KB   Difficulty: Total Submit: 396  Acc ...

  7. BZOJ4297 : [PA2015]Rozstaw szyn

    每个点的最优取值范围是一个区间,将叶子一层层剥去,得到一棵有根树,父亲的取值范围由儿子推得,时间复杂度$O(n\log n)$. #include<cstdio> #include< ...

  8. html5中manifest特性测试

    测试环境和工具   chromium  18.0.1025.151 (开发编译版 130497 Linux) Ubuntu 11.04 一.测试内容 1.A页面manifest缓存的js文件,B页面不 ...

  9. Codeforces Round #206 (Div. 2) A. Vasya and Digital Root

    #include <iostream> using namespace std; int main(){ int k,d; cin >> k >>d; ) { k ...

  10. 【BZOJ】1189: [HNOI2007]紧急疏散evacuate(二分+bfs+网络流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1189 表示完全不会QAQ.... 于是膜拜题解orz 二分时间........... 于是转换成判定 ...