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 }