java中double型資料運算出現的怪現象解析?

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.};

相關問題答案