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();  
       }  
   } 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM