Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。(引用于百度百科)
进入主题,代码
/** * Created by lake * 此类的功能:BigDecimal 加减乘除 */ public class BigDecimalUtils { /** * 提供精确的加法运算。 * @param d1 被加数 * @param d2 加数 * @return 两个参数的和 */ public static double Addition(double d1, double d2) { BigDecimal firstNum = new BigDecimal(Double.toString(d1)); BigDecimal secondNum = new BigDecimal(Double.toString(d2)); return firstNum.add(secondNum).doubleValue(); } /** * * 提供精确的减法运算。 * @param d1 被减数 * @param d2 减数 * @return 两个参数的差 */ public static double Subtraction(double d1, double d2) { BigDecimal firstNum = new BigDecimal(Double.toString(d1)); BigDecimal secondNum = new BigDecimal(Double.toString(d2)); return firstNum.subtract(secondNum).doubleValue(); } /** * * 提供精确的乘法运算。 * @param d1 被乘数 * @param d2 乘数 * @return 两个参数的积 */ public static double Multiplication(double d1, double d2) { BigDecimal firstNum = new BigDecimal(Double.toString(d1)); BigDecimal secondNum = new BigDecimal(Double.toString(d2)); return firstNum.multiply(secondNum).doubleValue(); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 * 定精度,以后的数字四舍五入。 * @param d1 被除数 * @param d2 除数 * @param scale 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */ public static double Division(double d1, double d2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "精确的位数不能小于0"); } BigDecimal firstNum = new BigDecimal(Double.toString(d1)); BigDecimal secondNum = new BigDecimal(Double.toString(d2)); return firstNum.divide(secondNum, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精确的小数位四舍五入处理。 * @param d 需要四舍五入的数字 * @param num 小数点后保留几位 * @return 四舍五入后的结果 */ public static double Rounding(double d, int num) { if (num < 0) { throw new IllegalArgumentException("精确的位数不能小于0"); } BigDecimal firstNum = new BigDecimal(Double.toString(d)); BigDecimal secondNum = new BigDecimal("1"); return firstNum.divide(secondNum, num, BigDecimal.ROUND_HALF_UP).doubleValue(); } }
简单的使用:
String s = BigDecimalUtils.Division(1, 5, 2) + ""; Log.e("ceshi", "onCreate: " + s); String s1 = BigDecimalUtils.Addition(1, 5) + ""; Log.e("ceshi", "onCreate: " + s1); String s11 = BigDecimalUtils.Subtraction(1, 5) + ""; Log.e("ceshi", "onCreate: " + s11); String s111 = BigDecimalUtils.Multiplication(1, 5) + ""; Log.e("ceshi", "onCreate: " + s111);
打印结果:0.2, 6.0, -4.0, 5.0