JAVA處理高精度計(jì)算_第1頁
JAVA處理高精度計(jì)算_第2頁
JAVA處理高精度計(jì)算_第3頁
JAVA處理高精度計(jì)算_第4頁
JAVA處理高精度計(jì)算_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、JAVA處理高精度計(jì)算Double.valueOf(String and Float.valueOf(String都會(huì)丟失精度。為了解決這個(gè)問題,需要用到BigDecimal類。使用的BigDecimal類的時(shí)候需要注意的地方:1. 在實(shí)例化BigDecimal 的時(shí)候用 new BigDecimal(String  代替new BigDecimal(double ,new BigDecimal(float在Effective Java書中有提到2. 比較兩個(gè)數(shù)的時(shí)候用compareTo  小于返回-1 , 等于返回0 , 大于返回1javaimport java.math

2、.BigDecimal;  public class ArithmeticUtil        /*      * 小數(shù)精確的位數(shù)      */      private static final int DEF_DIV_SCALE = 10;       /*   

3、0;  * 提供精確的加法運(yùn)算。      *      * param v1      *            被加數(shù)      * param v2      *     &

4、#160;      加數(shù)      * return 兩個(gè)參數(shù)的和      */      public static double add(double v1, double v2           BigDecimal b1 = new BigDecimal(Double.toString(v1;&

5、#160;         BigDecimal b2 = new BigDecimal(Double.toString(v2;          return b1.add(b2.doubleValue(;                /*    

6、;  * 提供精確的加法運(yùn)算。      *      * param v1      *            被加數(shù)      * param v2      *     &#

7、160;      加數(shù)      * return 兩個(gè)參數(shù)的和      */      public static BigDecimal add(String v1, String v2           BigDecimal b1 = new BigDecimal(v1;  &#

8、160;       BigDecimal b2 = new BigDecimal(v2;          return b1.add(b2;                /*      * 提供精確的加法運(yùn)算。 String  

9、60;   *      * param v1      *            被加數(shù)      * param v2      *           

10、加數(shù)      * return 兩個(gè)參數(shù)的和      */      public static String strAdd(String v1, String v2,int scale           if (scale < 0          

11、60;    throw new IllegalArgumentException(                      "The scale must be a positive integer or zero"           

12、;         BigDecimal b1 = new BigDecimal(v1;          BigDecimal b2 = new BigDecimal(v2;          return b1.add(b2.setScale(scale, BigDecimal.ROUND_HALF_UP.toString(;

13、0;           /*      * 提供精確的減法運(yùn)算。      *      * param v1      *            被減數(shù)   

14、0;  * param v2      *            減數(shù)      * return 兩個(gè)參數(shù)的差      */      public static double sub(double v1, double v2     

15、      BigDecimal b1 = new BigDecimal(Double.toString(v1;          BigDecimal b2 = new BigDecimal(Double.toString(v2;          return b1.subtract(b2.doubleValue(;    

16、            /*      * 提供精確的減法運(yùn)算。      *      * param v1      *            被減數(shù)   

17、   * param v2      *            減數(shù)      * return 兩個(gè)參數(shù)的差      */      public static BigDecimal sub(String v1, String v2   

18、0;       BigDecimal b1 = new BigDecimal(v1;          BigDecimal b2 = new BigDecimal(v2;          return b1.subtract(b2;           

19、     /*      * 對一個(gè)數(shù)字取精度      * param v      * param scale      * return      */      public static BigDecimal round(String v, int

20、scale           if (scale < 0               throw new IllegalArgumentException(                  

21、    "The scale must be a positive integer or zero"                    BigDecimal b = new BigDecimal(v;          BigDecimal one = new BigDeci

22、mal("1"          return b.divide(one, scale, BigDecimal.ROUND_HALF_UP;                /*      * 提供精確的減法運(yùn)算。String      * 

23、     * param v1      *            被減數(shù)      * param v2      *            減數(shù)   

24、60;  * return 兩個(gè)參數(shù)的差      */      public static String strSub(String v1, String v2,int scale           if (scale < 0               t

25、hrow new IllegalArgumentException(                      "The scale must be a positive integer or zero"              

26、0;     BigDecimal b1 = new BigDecimal(v1;          BigDecimal b2 = new BigDecimal(v2;          return b1.subtract(b2.setScale(scale, BigDecimal.ROUND_HALF_UP.toString(;   

27、0;        /*      * 提供精確的乘法運(yùn)算。      *      * param v1      *            被乘數(shù)      * param v

28、2      *            乘數(shù)      * return 兩個(gè)參數(shù)的積      */      public static double mul(double v1, double v2        

29、   BigDecimal b1 = new BigDecimal(Double.toString(v1;          BigDecimal b2 = new BigDecimal(Double.toString(v2;          return b1.multiply(b2.doubleValue(;        

30、;        /*      * 提供精確的乘法運(yùn)算。      *      * param v1      *            被乘數(shù)      * par

31、am v2      *            乘數(shù)      * return 兩個(gè)參數(shù)的積      */      public static BigDecimal mul(String v1, String v2      

32、0;    BigDecimal b1 = new BigDecimal(v1;          BigDecimal b2 = new BigDecimal(v2;          return b1.multiply(b2;              

33、  /*      * 提供精確的乘法運(yùn)算。 保留scale 位小數(shù)      *      * param v1      *            被乘數(shù)      * param v2   &#

34、160;  *            乘數(shù)      * return 兩個(gè)參數(shù)的積      */      public static double mul2(double v1, double v2,int scale         

35、0; BigDecimal b1 = new BigDecimal(Double.toString(v1;          BigDecimal b2 = new BigDecimal(Double.toString(v2;          return  round(b1.multiply(b2.doubleValue(,scale;      

36、60;         /*      * 提供精確的乘法運(yùn)算。 保留scale 位小數(shù) String      *      * param v1      *            被乘數(shù) 

37、60;    * param v2      *            乘數(shù)      * return 兩個(gè)參數(shù)的積      */      public static String strMul2(String v1, String v2,int sca

38、le           if (scale < 0               throw new IllegalArgumentException(                  

39、60;   "The scale must be a positive integer or zero"                    BigDecimal b1 = new BigDecimal(v1;          BigDecimal b2 = new BigDecima

40、l(v2;          return b1.multiply(b2.setScale(scale, BigDecimal.ROUND_HALF_UP.toString(;            /*      * 提供(相對)精確的除法運(yùn)算,當(dāng)發(fā)生除不盡的情況時(shí),精確到 小數(shù)點(diǎn)以后10位,以后的數(shù)字四舍五入。   

41、0;  *      * param v1      *            被除數(shù)      * param v2      *            除數(shù) 

42、;     * return 兩個(gè)參數(shù)的商      */      public static BigDecimal div(String v1, String v2           return div(v1, v2, DEF_DIV_SCALE;          &#

43、160;     /*      * 提供(相對)精確的除法運(yùn)算,當(dāng)發(fā)生除不盡的情況時(shí),精確到 小數(shù)點(diǎn)以后10位,以后的數(shù)字四舍五入。      *      * param v1      *            被除數(shù)  &

44、#160;   * param v2      *            除數(shù)      * return 兩個(gè)參數(shù)的商      */      public static double div(double v1, double v2   

45、60;       return div(v1, v2, DEF_DIV_SCALE;             /*      * 提供(相對)精確的除法運(yùn)算。當(dāng)發(fā)生除不盡的情況時(shí),由scale參數(shù)指 定精度,以后的數(shù)字四舍五入。      *      * param v1&#

46、160;     *            被除數(shù)      * param v2      *            除數(shù)      * param scale  &#

47、160;   *            表示需要精確到小數(shù)點(diǎn)以后幾位。      * return 兩個(gè)參數(shù)的商      */      public static double div(double v1, double v2, int scale      

48、60;    if (scale < 0               throw new IllegalArgumentException(                      "The scale must

49、 be a positive integer or zero"                    BigDecimal b1 = new BigDecimal(Double.toString(v1;          BigDecimal b2 = new BigDecimal(Double.toString(v2

50、;          return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP.doubleValue(;                /*      * 提供(相對)精確的除法運(yùn)算。當(dāng)發(fā)生除不盡的情況時(shí),由scale參數(shù)指 定精度,以后的數(shù)字四舍五入。 &#

51、160;    *      * param v1      *            被除數(shù)      * param v2      *          

52、  除數(shù)      * param scale      *            表示需要精確到小數(shù)點(diǎn)以后幾位。      * return 兩個(gè)參數(shù)的商      */      public static BigDecima

53、l div(String v1, String v2, int scale           if (scale < 0               throw new IllegalArgumentException(            

54、0;         "The scale must be a positive integer or zero"                    BigDecimal b1 = new BigDecimal(v1;        &

55、#160; BigDecimal b2 = new BigDecimal(v2;          return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP;             /*      * 精確的除法運(yùn)算。除不盡時(shí),由scale參數(shù)指 定精度 四舍五入。string  

56、;    *      * param v1      *            被除數(shù)      * param v2      *          

57、60; 除數(shù)      * param scale      *            表示需要精確到小數(shù)點(diǎn)以后幾位。      * return 兩個(gè)參數(shù)的商      */      public static String strDi

58、v(String v1, String v2, int scale           if (scale < 0               throw new IllegalArgumentException(             &#

59、160;        "The scale must be a positive integer or zero"                    BigDecimal b1 = new BigDecimal(v1;         

60、; BigDecimal b2 = new BigDecimal(v2;          return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP.toString(;                /*      * 精確的除法運(yùn)算。除不盡時(shí),由scale參數(shù)指 定精

61、度 四舍五入。string      *      * param v1      *            被除數(shù)      * param v2      *      

62、60;     除數(shù)      * param scale      *            表示需要精確到小數(shù)點(diǎn)以后幾位。      * return 兩個(gè)參數(shù)的商      */      pu

63、blic static BigDecimal bigDiv(String v1, String v2, int scale           if (scale < 0               throw new IllegalArgumentException(        

64、0;             "The scale must be a positive integer or zero"                    BigDecimal b1 = new BigDecimal(v1;    &

65、#160;     BigDecimal b2 = new BigDecimal(v2;          return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP;            /*      * 取余數(shù)  string  

66、60;   * param v1      * param v2      * param scale      * return      */      public static BigDecimal strRemainder(String v1,String v2, int scale   

67、       if (scale < 0               throw new IllegalArgumentException(                      "

68、;The scale must be a positive integer or zero"                    BigDecimal b1 = new BigDecimal(v1;          BigDecimal b2 = new BigDecimal(v2;  

69、0;       return b1.remainder(b2.setScale(scale, BigDecimal.ROUND_HALF_UP;            /*      * 取余數(shù)  string      * param v1      * param v2&#

70、160;     * param scale      * return  string      */      public static String strRemainder2Str(String v1,String v2, int scale          if (scale < 0 &#

71、160;             throw new IllegalArgumentException(                      "The scale must be a positive integer or zero" 

72、;                   BigDecimal b1 = new BigDecimal(v1;          BigDecimal b2 = new BigDecimal(v2;          return b1.remaind

73、er(b2.setScale(scale, BigDecimal.ROUND_HALF_UP.toString(;                /*      * 比較大小 如果v1 大于v2 則 返回true 否則false      * param v1      * param v2 

74、60;    * return      */      public static boolean strcompareTo(String v1,String v2          BigDecimal b1 = new BigDecimal(v1;          BigDecim

75、al b2 = new BigDecimal(v2;          int bj = pareTo(b2;          boolean res ;          if(bj>0           &

76、#160;  res = true;          else              res = false;          return res;           

77、     /*      * 比較大小 如果v1 大于等于v2 則 返回true 否則false      * param v1      * param v2      * return      */      public static boolean

78、strcompareTo2(String v1,String v2          BigDecimal b1 = new BigDecimal(v1;          BigDecimal b2 = new BigDecimal(v2;          int bj = pareTo(b2;  

79、60;       boolean res ;          if(bj>=0              res = true;          else     &#

80、160;        res = false;          return res;                /*      * 比較大小 如果v1 等于v2 則 返回true 否則false    

81、;  * param v1      * param v2      * return      */      public static boolean strcompareTo3(String v1,String v2          BigDecimal b1 = new BigDecim

82、al(v1;          BigDecimal b2 = new BigDecimal(v2;          int bj = pareTo(b2;          boolean res ;          if(bj=0&

83、#160;             res = true;          else              res = false;          return

84、 res;                 /*      * 取余數(shù)  BigDecimal      * param v1      * param v2      * param scale   

85、0;  * return      */      public static BigDecimal bigRemainder(BigDecimal v1,BigDecimal v2, int scale          if (scale < 0             

86、;  throw new IllegalArgumentException(                      "The scale must be a positive integer or zero"             &

87、#160;      return v1.remainder(v2.setScale(scale, BigDecimal.ROUND_HALF_UP;                 /*      * 提供精確的小數(shù)位四舍五入處理。      *    &#

88、160; * param v      *            需要四舍五入的數(shù)字      * param scale      *            小數(shù)點(diǎn)后保留幾位    

89、60; * return 四舍五入后的結(jié)果      */      public static double round(double v, int scale           if (scale < 0               throw new Illegal

90、ArgumentException(                      "The scale must be a positive integer or zero"                 &#

91、160;  BigDecimal b = new BigDecimal(Double.toString(v;          BigDecimal one = new BigDecimal("1"          return b.divide(one, scale, BigDecimal.ROUND_HALF_UP.doubleValue(;   &#

92、160;            /*      * 提供精確的小數(shù)位四舍五入處理。string      *      * param v      *            需要四舍五入的

93、數(shù)字      * param scale      *            小數(shù)點(diǎn)后保留幾位      * return 四舍五入后的結(jié)果      */      public static String strRound(Strin

94、g v, int scale           if (scale < 0               throw new IllegalArgumentException(                

95、60;     "The scale must be a positive integer or zero"                    BigDecimal b = new BigDecimal(v;          return b.setScale(s

96、cale, BigDecimal.ROUND_HALF_UP.toString(;                 import java.math.BigDecimal;public class ArithmeticUtil     /*     * 小數(shù)精確的位數(shù)     */    priva

97、te static final int DEF_DIV_SCALE = 10;    /*     * 提供精確的加法運(yùn)算。     *     * param v1     *            被加數(shù)     * param v2  

98、;   *            加數(shù)     * return 兩個(gè)參數(shù)的和     */    public static double add(double v1, double v2         BigDecimal b1 = new BigDecimal(Double.toS

99、tring(v1;        BigDecimal b2 = new BigDecimal(Double.toString(v2;        return b1.add(b2.doubleValue(;          /*     * 提供精確的加法運(yùn)算。     * 

100、0;   * param v1     *            被加數(shù)     * param v2     *            加數(shù)     * return 兩個(gè)參數(shù)的和 

101、60;   */    public static BigDecimal add(String v1, String v2         BigDecimal b1 = new BigDecimal(v1;        BigDecimal b2 = new BigDecimal(v2;        return b1.add(b2

102、;          /*     * 提供精確的加法運(yùn)算。 String     *     * param v1     *            被加數(shù)     * param v2  

103、;   *            加數(shù)     * return 兩個(gè)參數(shù)的和     */    public static String strAdd(String v1, String v2,int scale         if (scale < 0   

104、;          throw new IllegalArgumentException(                    "The scale must be a positive integer or zero"      &#

105、160;         BigDecimal b1 = new BigDecimal(v1;        BigDecimal b2 = new BigDecimal(v2;        return b1.add(b2.setScale(scale, BigDecimal.ROUND_HALF_UP.toString(;      

106、;  /*     * 提供精確的減法運(yùn)算。     *     * param v1     *            被減數(shù)     * param v2     *      

107、;      減數(shù)     * return 兩個(gè)參數(shù)的差     */    public static double sub(double v1, double v2         BigDecimal b1 = new BigDecimal(Double.toString(v1;       

108、; BigDecimal b2 = new BigDecimal(Double.toString(v2;        return b1.subtract(b2.doubleValue(;          /*     * 提供精確的減法運(yùn)算。     *     * param v1   &#

109、160; *            被減數(shù)     * param v2     *            減數(shù)     * return 兩個(gè)參數(shù)的差     */    public s

110、tatic BigDecimal sub(String v1, String v2         BigDecimal b1 = new BigDecimal(v1;        BigDecimal b2 = new BigDecimal(v2;        return b1.subtract(b2;       &#

111、160;  /*     * 對一個(gè)數(shù)字取精度     * param v     * param scale     * return     */    public static BigDecimal round(String v, int scale         if (sca

112、le < 0             throw new IllegalArgumentException(                    "The scale must be a positive integer or zero"   

113、;             BigDecimal b = new BigDecimal(v;        BigDecimal one = new BigDecimal("1"        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP;  

114、60;       /*     * 提供精確的減法運(yùn)算。String     *     * param v1     *            被減數(shù)     * param v2     *&#

115、160;           減數(shù)     * return 兩個(gè)參數(shù)的差     */    public static String strSub(String v1, String v2,int scale         if (scale < 0     

116、0;       throw new IllegalArgumentException(                    "The scale must be a positive integer or zero"          

117、      BigDecimal b1 = new BigDecimal(v1;        BigDecimal b2 = new BigDecimal(v2;        return b1.subtract(b2.setScale(scale, BigDecimal.ROUND_HALF_UP.toString(;        /*&#

118、160;    * 提供精確的乘法運(yùn)算。     *     * param v1     *            被乘數(shù)     * param v2     *        

119、;    乘數(shù)     * return 兩個(gè)參數(shù)的積     */    public static double mul(double v1, double v2         BigDecimal b1 = new BigDecimal(Double.toString(v1;        BigDecimal

120、 b2 = new BigDecimal(Double.toString(v2;        return b1.multiply(b2.doubleValue(;          /*     * 提供精確的乘法運(yùn)算。     *     * param v1     * 

121、           被乘數(shù)     * param v2     *            乘數(shù)     * return 兩個(gè)參數(shù)的積     */    public static BigDec

122、imal mul(String v1, String v2         BigDecimal b1 = new BigDecimal(v1;        BigDecimal b2 = new BigDecimal(v2;        return b1.multiply(b2;          /*     * 提供精確的乘法運(yùn)算。 保留scale 位小數(shù)     *     * param v1     *            被乘數(shù)  

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論