java.math.BigDecimal的精度问题

1. 

String myMoney = "100.0128"; 

  BigDecimal money= new BigDecimal(myMoney); 

  //设置精度,以及舍入规则 
  money= money.setScale(2, BigDecimal.ROUND_HALF_UP); 

  System.out.println(money); 

  //100.01 



2. double myMoney = 100.0128; 

   myMoney  = Math.round(myMoney  * 100) / (double) 100  ; 

    BigDecimal money= new BigDecimal(myMoney); 

    System.out.println(money); //后面则有很多的小数 

   //为了保证小数位数为2位 

   BigDecimal money= new BigDecimal(Double.toString(myMoney)); 

    System.out.println(money); //小数位数则为2位 



这个类确实好用。在网上找到的,是一个女Java程序员写的。厉害~~~~~~哈哈

[java]  view plain copy
  1. /* 
  2. * 创建日期 2004-10-14 
  3. * 
  4. * 如果需要精确计算,非要用String来够造BigDecimal不可 
  5. */  
  6. package com.lims.actions.testqc.comm;  
  7. /** 
  8. * @author Jstar 
  9. * 
  10. * 
  11. * 窗口 > 首选项 > Java > 代码生成 > 代码和注释 
  12. */  
  13. import java.math.BigDecimal;  
  14. /** 
  15. * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 
  16. * 确的浮点数运算,包括加减乘除和四舍五入。 
  17. */  
  18. public class Arith {  
  19. //默认除法运算精度  
  20. private static final int DEF_DIV_SCALE = 10;  
  21. //这个类不能实例化  
  22. private Arith() {  
  23. }  
  24. /** 
  25.   * 提供精确的加法运算。 
  26.   * @param v1 被加数 
  27.   * @param v2 加数 
  28.   * @return 两个参数的和 
  29.   */  
  30. public static double add(double v1, double v2) {  
  31.   BigDecimal b1 = new BigDecimal(Double.toString(v1));  
  32.   BigDecimal b2 = new BigDecimal(Double.toString(v2));  
  33.   
  34.   return b1.add(b2).doubleValue();  
  35. }  
  36. /** 
  37.   * 提供精确的减法运算。 
  38.   * @param v1 被减数 
  39.   * @param v2 减数 
  40.   * @return 两个参数的差 
  41.   */  
  42. public static double sub(double v1, double v2) {  
  43.   BigDecimal b1 = new BigDecimal(Double.toString(v1));  
  44.   BigDecimal b2 = new BigDecimal(Double.toString(v2));  
  45.   return b1.subtract(b2).doubleValue();  
  46. }  
  47. /** 
  48.   * 提供精确的乘法运算。 
  49.   * @param v1 被乘数 
  50.   * @param v2 乘数 
  51.   * @return 两个参数的积 
  52.   */  
  53. public static double mul(double v1, double v2) {  
  54.   BigDecimal b1 = new BigDecimal(Double.toString(v1));  
  55.   BigDecimal b2 = new BigDecimal(Double.toString(v2));  
  56.   return b1.multiply(b2).doubleValue();  
  57. }  
  58. /** 
  59.   * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 
  60.   * 小数点以后10位,以后的数字四舍五入。 
  61.   * @param v1 被除数 
  62.   * @param v2 除数 
  63.   * @return 两个参数的商 
  64.   */  
  65. public static double div(double v1, double v2) {  
  66.   return div(v1, v2, DEF_DIV_SCALE);  
  67. }  
  68. /** 
  69.   * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 
  70.   * 定精度,以后的数字四舍五入。 
  71.   * @param v1 被除数 
  72.   * @param v2 除数 
  73.   * @param scale 表示表示需要精确到小数点以后几位。 
  74.   * @return 两个参数的商 
  75.   */  
  76. public static double div(double v1, double v2, int scale) {  
  77.   if (scale < 0) {  
  78. throw new IllegalArgumentException("The scale must be a positive integer or zero");  
  79.   }  
  80.   BigDecimal b = new BigDecimal(Double.toString(v));  
  81.   BigDecimal one = new BigDecimal("1");  
  82.   return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  
  83. }   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值