JAVA中如何對double或者float的浮點數進行精度計算

本篇介紹了在JAVA中如何對double或者float的浮點數進行精度計算,在JAVA中提供了多種參數來實現精度的不同控制方式。具體例子如下:

Java代碼
  1.   
  2. package  com.soft4j.utility;   
  3.   
  4. import  java.math.BigDecimal;   
  5.   
  6.   
  7. public   final   class  RoundTool {   
  8.   
  9.        
  10.      public   static   double  round( double  value,  int  scale,  int  roundingMode) {   
  11.         BigDecimal bd =  new  BigDecimal(value);   
  12.         bd = bd.setScale(scale, roundingMode);   
  13.          double  d = bd.doubleValue();   
  14.         bd =  null ;   
  15.          return  d;   
  16.     }   
  17.   
  18.        
  19.      public   static   void  main(String[] argc) {   
  20.          //下面都以保留2位小數爲例   
  21.            
  22.          //ROUND_UP   
  23.          //只要第2位後面存在大於0的小數,則第2位就+1   
  24.         System.out.println(round( 12.3401 , 2 ,BigDecimal.ROUND_UP)); //12.35   
  25.         System.out.println(round(- 12.3401 , 2 ,BigDecimal.ROUND_UP)); //-12.35   
  26.          //ROUND_DOWN   
  27.          //與ROUND_UP相反   
  28.          //直接捨棄第2位後面的所有小數   
  29.         System.out.println(round( 12.349 , 2 ,BigDecimal.ROUND_DOWN)); //12.34   
  30.         System.out.println(round(- 12.349 , 2 ,BigDecimal.ROUND_DOWN)); //-12.34   
  31.          //ROUND_CEILING   
  32.          //如果數字>0 則和ROUND_UP作用一樣   
  33.          //如果數字<0 則和ROUND_DOWN作用一樣   
  34.         System.out.println(round( 12.3401 , 2 ,BigDecimal.ROUND_CEILING)); //12.35   
  35.         System.out.println(round(- 12.349 , 2 ,BigDecimal.ROUND_CEILING)); //-12.34   
  36.          //ROUND_FLOOR   
  37.          //如果數字>0 則和ROUND_DOWN作用一樣   
  38.          //如果數字<0 則和ROUND_UP作用一樣   
  39.         System.out.println(round( 12.349 , 2 ,BigDecimal.ROUND_FLOOR)); //12.34   
  40.         System.out.println(round(- 12.3401 , 2 ,BigDecimal.ROUND_FLOOR)); //-12.35   
  41.          //ROUND_HALF_UP [這種方法最常用]   
  42.          //如果第3位數字>=5,則第2位數字+1     
  43.          //備註:只看第3位數字的值,不會考慮第3位之後的小數的   
  44.         System.out.println(round( 12.345 , 2 ,BigDecimal.ROUND_HALF_UP)); //12.35   
  45.         System.out.println(round( 12.3449 , 2 ,BigDecimal.ROUND_HALF_UP)); //12.34   
  46.         System.out.println(round(- 12.345 , 2 ,BigDecimal.ROUND_HALF_UP)); //-12.35   
  47.         System.out.println(round(- 12.3449 , 2 ,BigDecimal.ROUND_HALF_UP)); //-12.34   
  48.          //ROUND_HALF_DOWN   
  49.          //如果第3位數字>=5,則做ROUND_UP   
  50.          //如果第3位數字<5,則做ROUND_DOWN   
  51.         System.out.println(round( 12.345 , 2 ,BigDecimal.ROUND_HALF_DOWN)); //12.35   
  52.         System.out.println(round( 12.3449 , 2 ,BigDecimal.ROUND_HALF_DOWN)); //12.34   
  53.         System.out.println(round(- 12.345 , 2 ,BigDecimal.ROUND_HALF_DOWN)); //-12.35   
  54.         System.out.println(round(- 12.3449 , 2 ,BigDecimal.ROUND_HALF_DOWN)); //-12.34   
  55.          //ROUND_HALF_EVEN   
  56.          //如果第3位是偶數,則做ROUND_HALF_DOWN   
  57.          //如果第3位是奇數,則做ROUND_HALF_UP   
  58.         System.out.println(round( 12.346 , 2 ,BigDecimal.ROUND_HALF_EVEN)); //12.35   
  59.         System.out.println(round( 12.345 , 2 ,BigDecimal.ROUND_HALF_EVEN)); //12.35   
  60.     }   
  61. }  

《Double精度的常用設置》

 
import java.text.DecimalFormat;
import java.math.BigDecimal;
public class Test_Double{
   public static void main(String[] args){
       //-----方法1--------四捨五入  round對負數是五舍六入
       double d_1 = 123.9;
       System.out.println("d_1 = "+Math.round(d_1));
       //-------方法2------------------
       DecimalFormat decfmt = new DecimalFormat("##0.00");  
       System.out.println(decfmt.format(1.33482222));
       //--------方法3--------------
       double x = 1.33345;  
       java.text.NumberFormat formate = java.text.NumberFormat.getNumberInstance();  
       formate.setMaximumFractionDigits(3);//設定小數最大爲數,那麼顯示的最後會四捨五入的  
       String m = formate.format(x);  
       System.out.println(m); 
       //--------方法4--------------
       BigDecimal bd = new BigDecimal(1.234543);  
       bd = bd.setScale(3,BigDecimal.ROUND_HALF_EVEN);  
       double d = bd.doubleValue();  
       System.out.println(d);
       //--------取消科學計數法-------------
       Double dValue = Double.valueOf("276363652844.8477474"); 
       System.out.println(dValue);
       BigDecimal original = new BigDecimal(dValue.doubleValue()); 
       BigDecimal result = original.setScale(2, BigDecimal.ROUND_HALF_DOWN);
       String test = result.toString();
       System.out.println(test);
   }
}
 
 
    使用Java,double 進行運算時,經常出現精度丟失的問題,總是在一個正確的結果左右偏0.0000**1。特別在實際項目中,通過一個公式校驗該值是否大於0,如果大於0我們會做一件事情,小於0我們又處理其他事情。這樣的情況通過double計算出來的結果去和0比較大小,尤其是有小數點的時候,經常會因爲精度丟失而導致程序處理流程出錯。
     所以一般對double類型進行運算時,做好對結果進行處理,然後拿這個值去做其他事情。

     目前總結如下:

      
    public static double round(double value, int scale,
             int roundingMode) {  
        BigDecimal bd = new BigDecimal(value);  
        bd = bd.setScale(scale, roundingMode);  
        double d = bd.doubleValue();  
        bd = null;  
        return d;  
    }  


    
    public double sum(double d1,double d2){
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.add(bd2).doubleValue();
    }


   
    public double sub(double d1,double d2){
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.subtract(bd2).doubleValue();
    }

   
    public double mul(double d1,double d2){
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.multiply(bd2).doubleValue();
    }


   
    public double div(double d1,double d2,int scale){
        //  當然在此之前,你要判斷分母是否爲0,  
        //  爲0你可以根據實際需求做相應的處理

        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.divide
               (bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }


這樣,計算double類型的數據計算問題就可以處理了。
另外補充一下 JavaScript 四捨五入的方法:
小數點問題
Math.round(totalAmount*100)/100 (保留 2 位)

function formatFloat(src, pos)
{
  return Math.round(src*Math.pow(10, pos))/Math.pow(10, pos);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章