1.package org.nutz.mvc.core;
2.
3.import java.math.BigDecimal;
4.
5.public class Arith {
6. // 原始檔Arith.java:
7.
8. /**
9. * 由於Java的簡單型別不能夠精確的對浮點數進行運算,這個工具類提供精 確的浮點數運算,包括加減乘除和四捨五入。
10. */
11.
12. // 預設除法運算精度
13. private static final int DEF_DIV_SCALE = 10;
14.
15. // 這個類不能例項化
16. private Arith() {
17. }
18.
19. /**
20. * 提供精確的加法運算。
21. *
22. * @param v1
23. * 被加數
24. * @param v2
25. * 加數
26. * @return 兩個引數的和
27. */
28.
29. public static double add(double v1, double v2) {
30. BigDecimal b1 = new BigDecimal(Double.toString(v1));
31. BigDecimal b2 = new BigDecimal(Double.toString(v2));
32. return b1.add(b2).doubleValue();
33. }
34.
35. /**
36. * 提供精確的減法運算。
37. *
38. * @param v1
39. * 被減數
40. * @param v2
41. * 減數
42. * @return 兩個引數的差
43. */
44.
45. public static double sub(double v1, double v2) {
46. BigDecimal b1 = new BigDecimal(Double.toString(v1));
47. BigDecimal b2 = new BigDecimal(Double.toString(v2));
48. return b1.subtract(b2).doubleValue();
49. }
50.
51. /**
52. * 提供精確的乘法運算。
53. *
54. * @param v1
55. * 被乘數
56. * @param v2
57. * 乘數
58. * @return 兩個引數的積
59. */
60.
61. public static double mul(double v1, double v2) {
62. BigDecimal b1 = new BigDecimal(Double.toString(v1));
63. BigDecimal b2 = new BigDecimal(Double.toString(v2));
64. return b1.multiply(b2).doubleValue();
65. }
66.
67. /**
68. * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 小數點以後10位,以後的數字四捨五入。
69. *
70. * @param v1
71. * 被除數
72. * @param v2
73. * 除數
74. * @return 兩個引數的商
75. */
76.
77. public static double div(double v1, double v2) {
78. return div(v1, v2, DEF_DIV_SCALE);
79. }
80.
81. /**
82. * 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale引數指 定精度,以後的數字四捨五入。
83. *
84. * @param v1
85. * 被除數
86. * @param v2
87. * 除數
88. * @param scale
89. * 表示表示需要精確到小數點以後幾位。
90. * @return 兩個引數的商
91. */
92.
93. public static double div(double v1, double v2, int scale) {
94. if (scale < 0) {
95. throw new IllegalArgumentException(
96. "The scale must be a positive integer or zero");
97. }
98. BigDecimal b1 = new BigDecimal(Double.toString(v1));
99. BigDecimal b2 = new BigDecimal(Double.toString(v2));
100. return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
101. }
102.
103. /**
104. * 提供精確的小數位四捨五入處理。
105. *
106. * @param v
107. * 需要四捨五入的數字
108. * @param scale
109. * 小數點後保留幾位
110. * @return 四捨五入後的結果
111. */
112.
113. public static double round(double v, int scale) {
114. if (scale < 0) {
115. throw new IllegalArgumentException(
116. "The scale must be a positive integer or zero");
117. }
118. BigDecimal b = new BigDecimal(Double.toString(v));
119. BigDecimal one = new BigDecimal("1");
120. return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
121. }
122.};