自寫自看

          java中double運算的問題

          double t1=34.0;
          double t2=2.55
          System.out.println(t1*t2);
          結果不等于 86.7

          解決方案 采用 java.math.BigDecimal
          此處有一個通用類

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

          posted on 2007-12-10 20:47 昨夜人生 閱讀(3449) 評論(1)  編輯  收藏 所屬分類: Java

          Feedback

          # re: java中double運算的問題 2008-10-01 23:32 YEL

          DING  回復  更多評論   


          主站蜘蛛池模板: 上饶县| 将乐县| 新干县| 桓台县| 玛纳斯县| 广水市| 突泉县| 从化市| 东方市| 高尔夫| 馆陶县| 长春市| 阿尔山市| 铜陵市| 淮北市| 铜山县| 昆山市| 长春市| 西吉县| 班戈县| 栖霞市| 兰西县| 蒲城县| 民县| 台州市| 凤翔县| 枣庄市| 汉阴县| 凉城县| 洛阳市| 格尔木市| 鹤岗市| 九龙坡区| 昌黎县| 东乌珠穆沁旗| 台北市| 襄汾县| 霍林郭勒市| 宁津县| 巫山县| 西华县|