自写自看

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 昨夜人生 阅读(3429) 评论(1)  编辑  收藏 所属分类: Java

Feedback

# re: java中double运算的问题 2008-10-01 23:32 YEL

DING  回复  更多评论   



只有注册用户登录后才能发表评论。


网站导航: