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