BigDecimal相关——高精度数的处理

java.math.BigDecmal.(java.math.BigInteger)

从MySQL数据库中读取出decimal(4,2)类型的数据进行累加统计时,会出现精度问题。

对于在java中处理数字运算,如果涉及到小数点后多位运算,则会出现精度问题。

比如:

  190.3在加法中就会变成190.29999994这样的异常精度数。

这是因为float与double类型本身就是不准确。只能用来做科学计算或工程计算。在商业计算中我们要用BigDecimal。

BigDecimal一共有4个构造方法,其中两个是:

BigDecimal(double val); Translates a double into a BigDecimal.

BigDecimal(String val); Translates the String repre sentation of a BigDecimal into a BigDecimal.

如果我们需要精确计算,要用String来构造BigDecimal。

可以自己写一个工具类  Arith()  ——摘抄自新浪blogs。

 

 1 /**
 2  * 
 3  */
 4 package com.clarion.worksys.util;
 5 
 6 import java.math.BigDecimal;
 7 
 8 /**
 9  * @author weng_zhangchu
10  *
11  */
12 public final class Arith {// 这个类不能实例化
13      
14      private static final int DEF_DIV_SCALE = 2;
15      // 默认除法运算精度
16      private Arith() {
17      }
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      public static double sub(double v1, double v2) {
26       BigDecimal b1 = new BigDecimal(Double.toString(v1));
27       BigDecimal b2 = new BigDecimal(Double.toString(v2));
28       return b1.subtract(b2).doubleValue();
29      }
30      
31      public static double mul(double v1, double v2) {
32       BigDecimal b1 = new BigDecimal(Double.toString(v1));
33       BigDecimal b2 = new BigDecimal(Double.toString(v2));
34       return b1.multiply(b2).doubleValue();
35      }
36      
37      public static double div(double v1, double v2) {
38       return div(v1, v2, DEF_DIV_SCALE);
39      }
40      
41      public static double div(double v1, double v2, int scale) {
42       if (scale < 0) {
43        throw new IllegalArgumentException(
44        "The scale must be a positive integer or zero");
45       }
46       BigDecimal b1 = new BigDecimal(Double.toString(v1));
47       BigDecimal b2 = new BigDecimal(Double.toString(v2));
48       return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
49      }
50      
51      public static double round(double v, int scale) {
52       if (scale < 0) {
53        throw new IllegalArgumentException(
54        "The scale must be a positive integer or zero");
55       }
56       BigDecimal b = new BigDecimal(Double.toString(v));
57       BigDecimal one = new BigDecimal("1");
58       return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
59      }
60 }


 

posted @ 2013-04-15 16:44  魔术先生  阅读(316)  评论(0编辑  收藏  举报