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 print ?
  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.   * @param v1 被加数
  26.   * @param v2 加数
  27.   * @return 两个参数的和
  28.   */ 
  29. public static double add(double v1, double v2) { 
  30.   BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
  31.   BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
  32.  
  33.   return b1.add(b2).doubleValue(); 
  34. /**
  35.   * 提供精确的减法运算。
  36.   * @param v1 被减数
  37.   * @param v2 减数
  38.   * @return 两个参数的差
  39.   */ 
  40. public static double sub(double v1, double v2) { 
  41.   BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
  42.   BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
  43.   return b1.subtract(b2).doubleValue(); 
  44. /**
  45.   * 提供精确的乘法运算。
  46.   * @param v1 被乘数
  47.   * @param v2 乘数
  48.   * @return 两个参数的积
  49.   */ 
  50. public static double mul(double v1, double v2) { 
  51.   BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
  52.   BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
  53.   return b1.multiply(b2).doubleValue(); 
  54. /**
  55.   * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
  56.   * 小数点以后10位,以后的数字四舍五入。
  57.   * @param v1 被除数
  58.   * @param v2 除数
  59.   * @return 两个参数的商
  60.   */ 
  61. public static double div(double v1, double v2) { 
  62.   return div(v1, v2, DEF_DIV_SCALE); 
  63. /**
  64.   * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
  65.   * 定精度,以后的数字四舍五入。
  66.   * @param v1 被除数
  67.   * @param v2 除数
  68.   * @param scale 表示表示需要精确到小数点以后几位。
  69.   * @return 两个参数的商
  70.   */ 
  71. public static double div(double v1, double v2, int scale) { 
  72.   if (scale < 0) { 
  73. throw new IllegalArgumentException("The scale must be a positive integer or zero"); 
  74.   } 
  75.   BigDecimal b = new BigDecimal(Double.toString(v)); 
  76.   BigDecimal one = new BigDecimal("1"); 
  77.   return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); 
  78. }  

你可能感兴趣的:(java.math.BigDecimal的精度问题)