java除法保存小数点后位数的方法(附精确计算工具类)

(double) (Math.round(sd3*10000)/10000.0);  // 这样为保持4位
(double) (Math.round(sd3*100)/100.0); // 这样为保持2位.

2.另一种办法

import java.text.DecimalFormat;
// 第一个为2位,第二个为3位.
DecimalFormat df2  = new DecimalFormat("###.00");
DecimalFormat df2  = new DecimalFormat("###.000");
System.out.println(df2.format(doube_var));

3.第三种方法

BigDecimal b1 = new BigDecimal(Double.toString(v1));  
BigDecimal b2 = new BigDecimal(Double.toString(v2));  
rslt = b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
// scale表示表示需要精确到小数点以后几位。

4.第四种方法
如果要精确计算后去除小数点,计算出来BigDecimal类型的结果后,有如下三个方法:

toBigInteger()   // 如果数字很大用这个,返回一个BigInteger类的对象(JAVA中有这样的类,如果你的程序确实只要整数的话就用这个类吧。),小数部分直接CUT。
intValue()  // 返回int型
longValue() // 返回long型

参考:http://foolraty.iteye.com/blog/648171

import java.math.BigDecimal;   
   import java.text.DecimalFormat;   
     
   public class TestGetInt {   
   public static void main(String[] args) {   
   double i = 2, j = 2.1, k = 2.5, m = 2.9;   
     
   System.out.println("舍掉小数取整:Math.floor(" + i + ")=" + (int) Math.floor(i));   
   System.out.println("舍掉小数取整:Math.floor(" + j + ")=" + (int) Math.floor(j));   
   System.out.println("舍掉小数取整:Math.floor(" + k + ")=" + (int) Math.floor(k));   
   System.out.println("舍掉小数取整:Math.floor(" + m + ")=" + (int) Math.floor(m));   
   System.out.println();   
     
   System.out.println("舍掉小数取整:Math.floor(-" + i + ")=" + (int) Math.floor(-i));   
   System.out.println("舍掉小数取整:Math.floor(-" + j + ")=" + (int) Math.floor(-j));   
   System.out.println("舍掉小数取整:Math.floor(-" + k + ")=" + (int) Math.floor(-k));   
   System.out.println("舍掉小数取整:Math.floor(-" + m + ")=" + (int) Math.floor(-m));   
   System.out.println();   
     
   // 这段被注释的代码不能正确的实现四舍五入取整   
   System.out.println("四舍五入取整:Math.rint(" + i + ")=" + (int) Math.rint(i));   
   System.out.println("四舍五入取整:Math.rint(" + j + ")=" + (int) Math.rint(j));   
   System.out.println("四舍五入取整:Math.rint(" + k + ")=" + (int) Math.rint(k));   
   System.out.println("四舍五入取整:Math.rint(" + m + ")=" + (int) Math.rint(m));   
   System.out.println();   
     
   System.out.println("四舍五入取整:Math.rint(-" + i + ")=" + (int) Math.rint(-i));   
   System.out.println("四舍五入取整:Math.rint(-" + j + ")=" + (int) Math.rint(-j));   
   System.out.println("四舍五入取整:Math.rint(-" + k + ")=" + (int) Math.rint(-k));   
   System.out.println("四舍五入取整:Math.rint(-" + m + ")=" + (int) Math.rint(-m));   
   System.out.println();   
     
   System.out.println("DecimalFormat四舍五入取整:(" + i + ")="   
   + new DecimalFormat("0").format(i));   
   System.out.println("DecimalFormat四舍五入取整:(" + j + ")="   
   + new DecimalFormat("0").format(j));   
   System.out.println("DecimalFormat四舍五入取整:(" + k + ")="   
   + new DecimalFormat("0").format(k));   
   System.out.println("DecimalFormat四舍五入取整:(" + m + ")="   
   + new DecimalFormat("0").format(m));   
   System.out.println();   
    
   System.out.println("DecimalFormat四舍五入取整:(-" + i + ")="   
   + new DecimalFormat("0").format(-i));   
   System.out.println("DecimalFormat四舍五入取整:(-" + j + ")="   
   + new DecimalFormat("0").format(-j));   
   System.out.println("DecimalFormat四舍五入取整:(-" + k + ")="   
   + new DecimalFormat("0").format(-k));   
   System.out.println("DecimalFormat四舍五入取整:(-" + m + ")="   
   + new DecimalFormat("0").format(-m));   
   System.out.println();   
     
   System.out.println("BigDecimal四舍五入取整:(" + i + ")="   
   + new BigDecimal("2").setScale(0, BigDecimal.ROUND_HALF_UP));   
   System.out.println("BigDecimal四舍五入取整:(" + j + ")="   
   + new BigDecimal("2.1").setScale(0, BigDecimal.ROUND_HALF_UP));   
   System.out.println("BigDecimal四舍五入取整:(" + k + ")="   
   + new BigDecimal("2.5").setScale(0, BigDecimal.ROUND_HALF_UP));   
   System.out.println("BigDecimal四舍五入取整:(" + m + ")="   
   + new BigDecimal("2.9").setScale(0, BigDecimal.ROUND_HALF_UP));   
   System.out.println();   
     
   System.out.println("BigDecimal四舍五入取整:(-" + i + ")="   
   + new BigDecimal("-2").setScale(0, BigDecimal.ROUND_HALF_UP));   
   System.out.println("BigDecimal四舍五入取整:(-" + j + ")="   
   + new BigDecimal("-2.1").setScale(0, BigDecimal.ROUND_HALF_UP));   
   System.out.println("BigDecimal四舍五入取整:(-" + k + ")="   
   + new BigDecimal("-2.5").setScale(0, BigDecimal.ROUND_HALF_UP));   
   System.out.println("BigDecimal四舍五入取整:(-" + m + ")="   
   + new BigDecimal("-2.9").setScale(0, BigDecimal.ROUND_HALF_UP));   
   System.out.println();   
     
   System.out.println("凑整:Math.ceil(" + i + ")=" + (int) Math.ceil(i));   
   System.out.println("凑整:Math.ceil(" + j + ")=" + (int) Math.ceil(j));   
   System.out.println("凑整:Math.ceil(" + k + ")=" + (int) Math.ceil(k));   
   System.out.println("凑整:Math.ceil(" + m + ")=" + (int) Math.ceil(m));   
   System.out.println();   
     
   System.out.println("凑整:Math.ceil(-" + i + ")=" + (int) Math.ceil(-i));   
   System.out.println("凑整:Math.ceil(-" + j + ")=" + (int) Math.ceil(-j));   
   System.out.println("凑整:Math.ceil(-" + k + ")=" + (int) Math.ceil(-k));   
   System.out.println("凑整:Math.ceil(-" + m + ")=" + (int) Math.ceil(-m));   
   System.out.println();   
     
   System.out.println("四舍五入取整:Math.round(" + i + ")=" + (int) Math.round(i));   
   System.out.println("四舍五入取整:Math.round(" + j + ")=" + (int) Math.round(j));   
   System.out.println("四舍五入取整:Math.round(" + k + ")=" + (int) Math.round(k));   
   System.out.println("四舍五入取整:Math.round(" + m + ")=" + (int) Math.round(m));   
   System.out.println();   
     
   System.out.println("四舍五入取整:Math.round(-" + i + ")=" + (int) Math.round(-i));   
   System.out.println("四舍五入取整:Math.round(-" + j + ")=" + (int) Math.round(-j));   
   System.out.println("四舍五入取整:Math.round(-" + k + ")=" + (int) Math.round(-k));   
   System.out.println("四舍五入取整:Math.round(-" + m + ")=" + (int) Math.round(-m));   
   }   
     
   }

舍掉小数取整:Math.floor(2.0)=2
舍掉小数取整:Math.floor(2.1)=2
舍掉小数取整:Math.floor(2.5)=2
舍掉小数取整:Math.floor(2.9)=2

舍掉小数取整:Math.floor(-2.0)=-2
舍掉小数取整:Math.floor(-2.1)=-3
舍掉小数取整:Math.floor(-2.5)=-3
舍掉小数取整:Math.floor(-2.9)=-3

四舍五入取整:Math.rint(2.0)=2
四舍五入取整:Math.rint(2.1)=2
四舍五入取整:Math.rint(2.5)=2
四舍五入取整:Math.rint(2.9)=3

四舍五入取整:Math.rint(-2.0)=-2
四舍五入取整:Math.rint(-2.1)=-2
四舍五入取整:Math.rint(-2.5)=-2
四舍五入取整:Math.rint(-2.9)=-3

DecimalFormat四舍五入取整:(2.0)=2
DecimalFormat四舍五入取整:(2.1)=2
DecimalFormat四舍五入取整:(2.5)=2
DecimalFormat四舍五入取整:(2.9)=3

DecimalFormat四舍五入取整:(-2.0)=-2
DecimalFormat四舍五入取整:(-2.1)=-2
DecimalFormat四舍五入取整:(-2.5)=-2
DecimalFormat四舍五入取整:(-2.9)=-3

BigDecimal四舍五入取整:(2.0)=2
BigDecimal四舍五入取整:(2.1)=2
BigDecimal四舍五入取整:(2.5)=3
BigDecimal四舍五入取整:(2.9)=3

BigDecimal四舍五入取整:(-2.0)=-2
BigDecimal四舍五入取整:(-2.1)=-2
BigDecimal四舍五入取整:(-2.5)=-3
BigDecimal四舍五入取整:(-2.9)=-3

凑整:Math.ceil(2.0)=2
凑整:Math.ceil(2.1)=3
凑整:Math.ceil(2.5)=3
凑整:Math.ceil(2.9)=3

凑整:Math.ceil(-2.0)=-2
凑整:Math.ceil(-2.1)=-2
凑整:Math.ceil(-2.5)=-2
凑整:Math.ceil(-2.9)=-2

四舍五入取整:Math.round(2.0)=2
四舍五入取整:Math.round(2.1)=2
四舍五入取整:Math.round(2.5)=3
四舍五入取整:Math.round(2.9)=3

四舍五入取整:Math.round(-2.0)=-2
四舍五入取整:Math.round(-2.1)=-2
四舍五入取整:Math.round(-2.5)=-2
四舍五入取整:Math.round(-2.9)=-3
 
//==================================================================
关于BigDecimal的详细用法,可以参看
http://liuzidong.iteye.com/blog/1172248

最后摘录网上的一个程序员写的精确工具类,在很多文章中都有此代码,可以参考

import java.math.BigDecimal;  
     
   /**
    * @author Jstar  
    */  
   public class Arith {  
         
       // 默认除法运算精度  
       private static final int DEF_DIV_SCALE = 10;  
     
       // 这个类不能实例化  
       private Arith() {  
             
       }  
     
       /**
        * 提供精确的加法运算     
        * @param v1           被加数
        * @param v2            加数
        * @return 两个参数的和
        */  
       public static double add(double v1, double v2) {  
           BigDecimal b1 = new BigDecimal(Double.toString(v1));  
           BigDecimal b2 = new BigDecimal(Double.toString(v2));  
           return b1.add(b2).doubleValue();  
       }  
     
       /**
        * 提供精确的减法运算
        
        * @param v1            被减数
        * @param v2            减数
        * @return 两个参数的差
        */  
       public static double sub(double v1, double v2) {  
           BigDecimal b1 = new BigDecimal(Double.toString(v1));  
           BigDecimal b2 = new BigDecimal(Double.toString(v2));  
           return b1.subtract(b2).doubleValue();  
       }  
     
       /**
        * 提供精确的乘法运算     
        * @param v1            被乘数
        * @param v2            乘数
        * @return 两个参数的积
        */  
       public static double mul(double v1, double v2) {  
           BigDecimal b1 = new BigDecimal(Double.toString(v1));  
           BigDecimal b2 = new BigDecimal(Double.toString(v2));  
           return b1.multiply(b2).doubleValue();  
       }  
     
       /**
        * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入   
        * @param v1            被除数
        * @param v2            除数
        * @return 两个参数的商
        */  
       public static double div(double v1, double v2) {  
           return div(v1, v2, DEF_DIV_SCALE);  
       }  
     
       /**
        * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。     
        * @param v1            被除数
        * @param v2            除数
        * @param scale         表示表示需要精确到小数点以后几位。
        * @return 两个参数的商
        */  
       public static double div(double v1, double v2, int scale) {  
           if (scale < 0) {  
               throw new IllegalArgumentException(  
                       "The scale must be a positive integer or zero");  
           }  
           BigDecimal b1 = new BigDecimal(Double.toString(v1));  
           BigDecimal b2 = new BigDecimal(Double.toString(v2));  
           return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  
       }  
     
       /**
        * 提供精确的小数位四舍五入处理。   
        * @param v           需要四舍五入的数字
        * @param scale       小数点后保留几位
        * @return 四舍五入后的结果
        */  
       public static double round(double v, int scale) {  
           if (scale < 0) {  
               throw new IllegalArgumentException(  
                       "The scale must be a positive integer or zero");  
           }  
           BigDecimal b = new BigDecimal(Double.toString(v));  
           BigDecimal one = new BigDecimal("1");  
           return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  
       }  
   } 
posted @ 2012-07-04 11:47  日光之下无新事  阅读(37197)  评论(0编辑  收藏  举报