工具类-加减乘除高精度计算
今天出现一个怪现象:0.01+0.01 = 0.0199999999
这个误差对我们生活小打小闹没啥影响,但是对科学计算和银行这样的应用或者领域是致命的,因此要用Java银行以及科学计算会用java.math.BigDecimal提高精度,否则后果极其严重。
原文作者:http://www.cnblogs.com/linjiqin/p/5550760.html
import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; /** * 精确计算工具类,提供加减乘除的计算 add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。 subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。 multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。 divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。 toString() 将BigDecimal对象的数值转换成字符串。 doubleValue() 将BigDecimal对象中的值以双精度数返回。 floatValue() 将BigDecimal对象中的值以单精度数返回。 longValue() 将BigDecimal对象中的值以长整数返回。 intValue() 将BigDecimal对象中的值以整数返回。 */ public class CompuUtils { /** 常量--0 */ public static final int ZERO = 0; /** 常量--1 */ public static final int ONE = 1; /** 常量-- -1 */ public static final int MINUS_ONE = -1; /** * 大小比较 * * @param a * @param b * @return 返回1, 表示a大于b <br/> * 返回0 ,表示a等于b <br/> * 返回-1,表示a小于b * @author jqlin */ public static int compareTo(String a, String b) { return new BigDecimal(a).compareTo(new BigDecimal(b)); } /** * 加法运算 * * @param a 被加数 * @param b 加数 * @author jqlin */ public static BigDecimal add(String a, String b) { MathContext mc = new MathContext(20, RoundingMode.HALF_UP); return new BigDecimal(a).add(new BigDecimal(b), mc); } /** * 累加运算 * * @param vals * @return * @author jqlin */ public static int add(int... vals) { if (vals == null || vals.length <= 0) { return 0; } int sum = 0; for (int val : vals) { sum = sum + val; } return sum; } /** * 累加运算 * * @param vals * @return * @author jqlin */ public static long add(long... vals) { if (vals == null || vals.length <= 0) { return 0L; } long sum = 0L; for (long val : vals) { sum = sum + val; } return sum; } /** * 减法运算 * * @param a 被减数 * @param b 减数 * @author jqlin */ public static BigDecimal subtract(String a, String b) { MathContext mc = new MathContext(20, RoundingMode.HALF_UP); return new BigDecimal(a).subtract(new BigDecimal(b), mc); } /** * 乘法运算 * * @param a 被乘数 * @param b 乘数 * @author jqlin */ public static BigDecimal multiply(String a, String b) { MathContext mc = new MathContext(20, RoundingMode.HALF_UP); return new BigDecimal(a).multiply(new BigDecimal(b), mc); } /** * 除法运算 * * @param a 被除数 * @param b 除数 * @author jqlin */ public static BigDecimal divide(String a, String b) { return new BigDecimal(a).divide(new BigDecimal(b), 20, BigDecimal.ROUND_HALF_UP); } }