java 浮点数 高精度计算

    1. import java.math.BigDecimal;
    2. public class BigDecimalUtil {
    3. //默认除法运算精度
    4. private static final int DEF_DIV_SCALE = 10; //这个类不能实例化
    5. private BigDecimalUtil() {
    6. }
    7. /**
    8. * 提供精确的加法运算。
    9. *
    10. * @param v1 被加数
    11. * @param v2 加数
    12. * @return 两个参数的和
    13. * 返回double类型数据
    14. */
    15. public static double add(double v1, double v2) {
    16. BigDecimal b1 = new BigDecimal(Double.toString(v1));
    17. BigDecimal b2 = new BigDecimal(Double.toString(v2));
    18. return b1.add(b2).doubleValue();
    19. }
    20. /**
    21. * 提供精确的加法运算。
    22. *
    23. * @param v1 被加数
    24. * @param v2 加数
    25. * @return 两个参数的和
    26. * 返回字符串类型数据
    27. */
    28. public static String addToString(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).toString();
    32. }
    33. /**
    34. * 提供精确的减法运算。
    35. *
    36. * @param v1 被减数
    37. * @param v2 减数
    38. * @return 两个参数的差
    39. * 返回double类型数据
    40. */
    41. public static double sub(double v1, double v2) {
    42. BigDecimal b1 = new BigDecimal(Double.toString(v1));
    43. BigDecimal b2 = new BigDecimal(Double.toString(v2));
    44. return b1.subtract(b2).doubleValue();
    45. }
    46. /**
    47. * 提供精确的减法运算。
    48. *
    49. * @param v1 被减数
    50. * @param v2 减数
    51. * @return 两个参数的差
    52. * 返回字符串类型数据
    53. */
    54. public static String subString(double v1, double v2) {
    55. BigDecimal b1 = new BigDecimal(Double.toString(v1));
    56. BigDecimal b2 = new BigDecimal(Double.toString(v2));
    57. return b1.subtract(b2).toString();
    58. }
    59. /**
    60. * 提供精确的乘法运算。
    61. *
    62. * @param v1 被乘数
    63. * @param v2 乘数
    64. * @return 两个参数的积
    65. * 返回double类型数据
    66. */
    67. public static double mul(double v1, double v2) {
    68. BigDecimal b1 = new BigDecimal(Double.toString(v1));
    69. BigDecimal b2 = new BigDecimal(Double.toString(v2));
    70. return b1.multiply(b2).doubleValue();
    71. }
    72. /**
    73. * 提供精确的乘法运算。
    74. *
    75. * @param v1 被乘数
    76. * @param v2 乘数
    77. * @param scale 表示表示需要保留小数点后几位
    78. * @return 两个参数的积
    79. * 返回double类型数据
    80. */
    81. public static double mulByScale(double v1, double v2, int scale) {
    82. BigDecimal b1 = new BigDecimal(Double.toString(v1));
    83. BigDecimal b2 = new BigDecimal(Double.toString(v2));
    84. return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    85. }
    86. /**
    87. * 提供精确的乘法运算。
    88. *
    89. * @param v1 被乘数
    90. * @param v2 乘数
    91. * @param scale 表示表示需要保留小数点后几位
    92. * @return 两个参数的积
    93. * 返回字符串类型数据
    94. */
    95. public static String mulByScaleToString(double v1, double v2, int scale) {
    96. BigDecimal b1 = new BigDecimal(Double.toString(v1));
    97. BigDecimal b2 = new BigDecimal(Double.toString(v2));
    98. return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
    99. }
    100. /**
    101. * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
    102. * 小数点以后10位,以后的数字四舍五入。
    103. *
    104. * @param v1 被除数
    105. * @param v2 除数
    106. * @return 两个参数的商
    107. */
    108. public static double div(double v1, double v2) {
    109. return div(v1, v2, DEF_DIV_SCALE);
    110. }
    111. /**
    112. * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
    113. * 定精度,以后的数字四舍五入。
    114. *
    115. * @param v1 被除数
    116. * @param v2 除数
    117. * @param scale 表示表示需要精确到小数点以后几位。
    118. * @return 两个参数的商
    119. */
    120. public static double div(double v1, double v2, int scale) {
    121. if (scale < 0) {
    122. throw new IllegalArgumentException(
    123. "The scale must be a positive integer or zero");
    124. }
    125. BigDecimal b1 = new BigDecimal(Double.toString(v1));
    126. BigDecimal b2 = new BigDecimal(Double.toString(v2));
    127. return b2.divide(b1, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    128. }
    129. /**
    130. * 提供精确的小数位四舍五入处理。
    131. *
    132. * @param v 需要四舍五入的数字
    133. * @param scale 小数点后保留几位
    134. * @return 四舍五入后的结果
    135. */
    136. public static double round(double v, int scale) {
    137. if (scale < 0) {
    138. throw new IllegalArgumentException(
    139. "The scale must be a positive integer or zero");
    140. }
    141. BigDecimal b = new BigDecimal(Double.toString(v));
    142. BigDecimal one = new BigDecimal("1");
    143. return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    144. }
    145. }