Java BigDecimal 和Mysql 加減乘除,求餘,求平均值,查詢不等於某數值

BigDecimal

直接用數字轉換爲BigDecimal時會出現不精確的數值:

BigDecimal  e   =   new   BigDecimal(2.2);   
        System.out.println("e:"+e);    
        BigDecimal  f   =   new   BigDecimal(3.32);   
        System.out.println("f:"+f);    
        System.out.println("e+f="+e.add(f));  
         
        /* 
        e:2.20000000000000017763568394002504646778106689453125 
        f:3.319999999999999840127884453977458178997039794921875 
        e+f=5.520000000000000017763568394002504646778106689453125 
         */  

數字轉換爲字符串後再轉換爲BigDecimal時後計算則是精確的數值(所以先轉換爲字符串後再轉BigDecimal會得到精確的結果):

BigDecimal  e   =   new   BigDecimal("2.2");   
        System.out.println("e:"+e);    
        BigDecimal  f   =   new   BigDecimal("3.32");   
        System.out.println("f:"+f);    
        System.out.println("e+f="+e.add(f));  
        /*  結果如下: 
        e:2.2 
        f:3.32 
        e+f=5.52 
         */  

     當bigdecimal除不盡(循環小數)後會報錯,上面的是一種解決方法,下面的是BigDecimal ,divide方法提供的精確小數方法(推薦使用)

@Test  
    public void Testa(){  
        String currentLat2 = "2.455675";  
        BigDecimal   b   =   new   BigDecimal(currentLat2);  
        b=b.divide(new BigDecimal(3),2,BigDecimal.ROUND_HALF_UP);  
        System.out.println(b);  
    }//輸出是0.82  
1、ROUND_UP  
舍入遠離零的舍入模式。  
在丟棄非零部分之前始終增加數字(始終對非零捨棄部分前面的數字加1)。  
注意,此舍入模式始終不會減少計算值的大小。  
2、ROUND_DOWN  
接近零的舍入模式。  
在丟棄某部分之前始終不增加數字(從不對捨棄部分前面的數字加1,即截短)。  
注意,此舍入模式始終不會增加計算值的大小。  
3、ROUND_CEILING  
接近正無窮大的舍入模式。  
如果 BigDecimal 爲正,則舍入行爲與 ROUND_UP 相同;  
如果爲負,則舍入行爲與 ROUND_DOWN 相同。  
注意,此舍入模式始終不會減少計算值。  
4、ROUND_FLOOR  
接近負無窮大的舍入模式。  
如果 BigDecimal 爲正,則舍入行爲與 ROUND_DOWN 相同;  
如果爲負,則舍入行爲與 ROUND_UP 相同。  
注意,此舍入模式始終不會增加計算值。  
5、ROUND_HALF_UP  
向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則爲向上舍入的舍入模式。  
如果捨棄部分 >= 0.5,則舍入行爲與 ROUND_UP 相同;否則舍入行爲與 ROUND_DOWN 相同。  
注意,這是我們大多數人在小學時就學過的舍入模式(四捨五入)。  
6、ROUND_HALF_DOWN  
向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則爲上舍入的舍入模式。  
如果捨棄部分 > 0.5,則舍入行爲與 ROUND_UP 相同;否則舍入行爲與 ROUND_DOWN 相同(五舍六入)。  
7、ROUND_HALF_EVEN  
向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。  
如果捨棄部分左邊的數字爲奇數,則舍入行爲與 ROUND_HALF_UP 相同;  
如果爲偶數,則舍入行爲與 ROUND_HALF_DOWN 相同。  
注意,在重複進行一系列計算時,此舍入模式可以將累加錯誤減到最小。  
此舍入模式也稱爲“銀行家舍入法”,主要在美國使用。四捨六入,五分兩種情況。  
如果前一位爲奇數,則入位,否則捨去。  
以下例子爲保留小數點1位,那麼這種舍入方式下的結果。  
1.15>1.2 1.25>1.2  
8、ROUND_UNNECESSARY  
斷言請求的操作具有精確的結果,因此不需要舍入。  
如果對獲得精確結果的操作指定此舍入模式,則拋出ArithmeticException。  

如果加減需要保留小數位數可以調用函數完成後 再把結果進行setScale

保留整數 四捨五入 

Mysql

mysql中的/、div的區別

/運算符爲實數除,其運算的結果爲實型
div爲整除,該運算符只取商的整數部分,而不會四捨五入,網上說要求除數和被除數均爲整形

mysql> select 100.22 div 2.1;
+----------------+
| 100.22 div 2.1 |
+----------------+
|             47 |
+----------------+
1 row in set (0.00 sec)

mysql> select 100.22 / 2.1;
+--------------+
| 100.22 / 2.1 |
+--------------+
|    47.723810 |
+--------------+
1 row in set (0.00 sec)

除數爲0時會返回null 

數值運算符函數 

SELECT CEIL(3.01) ==>4 /*有n.xx 都是n+1 進一取整 向上取整 
SELECT FLOOR(3.99) ==>3 /*取n.xx 都是n 舍一取整 向下取整 
SELECT 3 DIV 4 ==> 0 /*整數除法,取商 
SELECT 3/4 ==>0.75 /*除法 
SELECT 2.1 MOD 2 ==>0.1 /*取餘數(取模) 被除數是整數,小數都可以 
SELECT 21 % 2 ==>1 /*取餘數 mod=% 
SELECT POWER(3,4) ==>81 /*3的4次方 冪運算 
SELECT ROUND(3.1415926,4) ==>3.1416 /*四捨五入,保留4位小數 
SELECT TRUNCATE(123.89,1) ==>123.8 /*截取小數點後的位數 
SELECT TRUNCATE(123.89,0) ==>123 /*截取小數點後的位置,0位爲整數部分 
SELECT TRUNCATE(123.89,-1) ==>120 /*截取-1,從個位起去掉後面的數值替換爲0

但是一般來講,用了函數索引就會失效,慎用

參考博客:

MYSQL常見運算符和函數(四)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章