JAVA处理高精度计算_第1页
JAVA处理高精度计算_第2页
JAVA处理高精度计算_第3页
JAVA处理高精度计算_第4页
JAVA处理高精度计算_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JAVA处理高精度计算Double.valueOf(String and Float.valueOf(String都会丢失精度。为了解决这个问题,需要用到BigDecimal类。使用的BigDecimal类的时候需要注意的地方:1. 在实例化BigDecimal 的时候用 new BigDecimal(String  代替new BigDecimal(double ,new BigDecimal(float在Effective Java书中有提到2. 比较两个数的时候用compareTo  小于返回-1 , 等于返回0 , 大于返回1javaimport java.math

2、.BigDecimal;  public class ArithmeticUtil        /*      * 小数精确的位数      */      private static final int DEF_DIV_SCALE = 10;       /*   

3、0;  * 提供精确的加法运算。      *      * param v1      *            被加数      * param v2      *     &

4、#160;      加数      * return 两个参数的和      */      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、;  * 提供精确的加法运算。      *      * param v1      *            被加数      * param v2      *     &#

7、160;      加数      * return 两个参数的和      */      public static BigDecimal add(String v1, String v2           BigDecimal b1 = new BigDecimal(v1;  &#

8、160;       BigDecimal b2 = new BigDecimal(v2;          return b1.add(b2;                /*      * 提供精确的加法运算。 String  

9、60;   *      * param v1      *            被加数      * param v2      *           

10、加数      * return 两个参数的和      */      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;           /*      * 提供精确的减法运算。      *      * param v1      *            被减数   

14、0;  * param v2      *            减数      * return 两个参数的差      */      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、            /*      * 提供精确的减法运算。      *      * param v1      *            被减数   

17、   * param v2      *            减数      * return 两个参数的差      */      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、     /*      * 对一个数字取精度      * 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;                /*      * 提供精确的减法运算。String      * 

23、     * param v1      *            被减数      * param v2      *            减数   

24、60;  * return 两个参数的差      */      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;        /*      * 提供精确的乘法运算。      *      * param v1      *            被乘数      * param v

28、2      *            乘数      * return 两个参数的积      */      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、;        /*      * 提供精确的乘法运算。      *      * param v1      *            被乘数      * par

31、am v2      *            乘数      * return 两个参数的积      */      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、  /*      * 提供精确的乘法运算。 保留scale 位小数      *      * param v1      *            被乘数      * param v2   &#

34、160;  *            乘数      * return 两个参数的积      */      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;         /*      * 提供精确的乘法运算。 保留scale 位小数 String      *      * param v1      *            被乘数 

37、60;    * param v2      *            乘数      * return 两个参数的积      */      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(;            /*      * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。   

41、0;  *      * param v1      *            被除数      * param v2      *            除数 

42、;     * return 两个参数的商      */      public static BigDecimal div(String v1, String v2           return div(v1, v2, DEF_DIV_SCALE;          &#

43、160;     /*      * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。      *      * param v1      *            被除数  &

44、#160;   * param v2      *            除数      * return 两个参数的商      */      public static double div(double v1, double v2   

45、60;       return div(v1, v2, DEF_DIV_SCALE;             /*      * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。      *      * param v1&#

46、160;     *            被除数      * param v2      *            除数      * param scale  &#

47、160;   *            表示需要精确到小数点以后几位。      * return 两个参数的商      */      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(;                /*      * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。 &#

51、160;    *      * param v1      *            被除数      * param v2      *          

52、  除数      * param scale      *            表示需要精确到小数点以后几位。      * return 两个参数的商      */      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;             /*      * 精确的除法运算。除不尽时,由scale参数指 定精度 四舍五入。string  

56、;    *      * param v1      *            被除数      * param v2      *          

57、60; 除数      * param scale      *            表示需要精确到小数点以后几位。      * return 两个参数的商      */      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(;                /*      * 精确的除法运算。除不尽时,由scale参数指 定精

61、度 四舍五入。string      *      * param v1      *            被除数      * param v2      *      

62、60;     除数      * param scale      *            表示需要精确到小数点以后几位。      * return 两个参数的商      */      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;            /*      * 取余数  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;            /*      * 取余数  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;                 /*      * 取余数  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;                 /*      * 提供精确的小数位四舍五入处理。      *    &#

88、160; * param v      *            需要四舍五入的数字      * param scale      *            小数点后保留几位    

89、60; * return 四舍五入后的结果      */      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;            /*      * 提供精确的小数位四舍五入处理。string      *      * param v      *            需要四舍五入的

93、数字      * param scale      *            小数点后保留几位      * return 四舍五入后的结果      */      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     /*     * 小数精确的位数     */    priva

97、te static final int DEF_DIV_SCALE = 10;    /*     * 提供精确的加法运算。     *     * param v1     *            被加数     * param v2  

98、;   *            加数     * return 两个参数的和     */    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(;          /*     * 提供精确的加法运算。     * 

100、0;   * param v1     *            被加数     * param v2     *            加数     * return 两个参数的和 

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、;          /*     * 提供精确的加法运算。 String     *     * param v1     *            被加数     * param v2  

103、;   *            加数     * return 两个参数的和     */    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、;  /*     * 提供精确的减法运算。     *     * param v1     *            被减数     * param v2     *      

107、;      减数     * return 两个参数的差     */    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(;          /*     * 提供精确的减法运算。     *     * param v1   &#

109、160; *            被减数     * param v2     *            减数     * return 两个参数的差     */    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;  /*     * 对一个数字取精度     * 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;       /*     * 提供精确的减法运算。String     *     * param v1     *            被减数     * param v2     *&#

115、160;           减数     * return 两个参数的差     */    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;    * 提供精确的乘法运算。     *     * param v1     *            被乘数     * param v2     *        

119、;    乘数     * return 两个参数的积     */    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(;          /*     * 提供精确的乘法运算。     *     * param v1     * 

121、           被乘数     * param v2     *            乘数     * return 两个参数的积     */    public static BigDec

122、imal mul(String v1, String v2         BigDecimal b1 = new BigDecimal(v1;        BigDecimal b2 = new BigDecimal(v2;        return b1.multiply(b2;          /*     * 提供精确的乘法运算。 保留scale 位小数     *     * param v1     *            被乘数  

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论