金融、科学、工程---科学计算

因为float和double不能精确的表达,或者任何10的负n次方。他们是设计来进行科学和工程上的计算,提供精确的近似值的。它们在涉及金融方面的计算则是不在行的。因为金融方面要求绝对的精确。



  1 package test.test;
  2 
  3 import java.math.BigDecimal;
  4 
  5 /**
  6  * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入。
  7  */
  8 
  9 public class Test {
 10     // 默认除法运算精度
 11     private static final int DEF_DIV_SCALE = 10;
 12 
 13     // 这个类不能实例化
 14     public Test() {
 15     }
 16 
 17     
 18     
 19     /**
 20      * 提供精确的加法运算。
 21      * @param v1    被加数
 22      * @param v2     加数
 23      * @return 两个参数的和
 24      */
 25     public static double add(double v1, double v2) {
 26 
 27         BigDecimal b1 = new BigDecimal(Double.toString(v1));
 28 
 29         BigDecimal b2 = new BigDecimal(Double.toString(v2));
 30 
 31         return b1.add(b2).doubleValue();
 32 
 33     }
 34 
 35     /**
 36      * 提供精确的减法运算。
 37      * @param v1    被减数
 38      * @param v2    减数
 39      *@return 两个参数的差
 40      */
 41     public static double sub(double v1, double v2) {
 42 
 43         BigDecimal b1 = new BigDecimal(Double.toString(v1));
 44 
 45         BigDecimal b2 = new BigDecimal(Double.toString(v2));
 46 
 47         return b1.subtract(b2).doubleValue();
 48     }
 49 
 50     /**
 51      * 提供精确的乘法运算。
 52      * @param v1    被乘数
 53      * @param v2    乘数
 54      * @return 两个参数的积
 55      */
 56     public static double mul(double v1, double v2) {
 57 
 58         BigDecimal b1 = new BigDecimal(Double.toString(v1));
 59 
 60         BigDecimal b2 = new BigDecimal(Double.toString(v2));
 61 
 62         return b1.multiply(b2).doubleValue();
 63 
 64     }
 65 
 66     /**
 67      * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 108. 109. * 小数点以后10位,以后的数字四舍五入。 
 68      * @param v1    被除数 
 69      * @param v2    除数 
 70      * @return 两个参数的商 
 71      */
 72     public static double div(double v1, double v2) {
 73         return div(v1, v2, DEF_DIV_SCALE);
 74     }
 75 
 76     /**
 77      * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
 78      * @param v1    被除数
 79      * @param v2    除数
 80      * @param scale    表示表示需要精确到小数点以后几位。
 81      * @return 两个参数的商
 82      */
 83     public static double div(double v1, double v2, int scale) {
 84         if (scale < 0) {
 85             throw new IllegalArgumentException("The scale must be a positive integer or zero");
 86         }
 87         BigDecimal b1 = new BigDecimal(Double.toString(v1));
 88 
 89         BigDecimal b2 = new BigDecimal(Double.toString(v2));
 90 
 91         return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
 92     }
 93 
 94     /**
 95      * 提供精确的小数位四舍五入处理。
 96      * @param     需要四舍五入的数字
 97      * @param scale    小数点后保留几位
 98      * @return 四舍五入后的结果
 99      */
100     public static double round(double v, int scale) {
101 
102         if (scale < 0) {
103             throw new IllegalArgumentException("The scale must be a positive integer or zero");
104         }
105 
106         BigDecimal b = new BigDecimal(Double.toString(v));
107 
108         BigDecimal one = new BigDecimal("1");
109 
110         return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
111 
112     }
113 
114 }


posted on 2009-08-07 13:54 彭伟 阅读(235) 评论(0)  编辑  收藏 所属分类: java技术分区


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


网站导航:
 
<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

常用链接

留言簿(3)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜