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
但是一般來講,用了函數索引就會失效,慎用
參考博客: