49e28c72bc62a01b5cdcc3f58e08e4a7e2c77981.svn-base 3.2 KB

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