今天碰到一個需求。關於小數點的處理,看起來很是簡單的事情,卻花了必定時間作了一些試驗。最後簡單總結一下,以便備忘。javascript
需求簡化一下表達是這樣的:前端
有A、B兩列,A/B=C。這3列在數據庫中都以decimal存放。java
在應用中,要求這3列,最多保留兩位小數,去掉小數點後無心義的0。舉例以下:mysql
3.03表示爲3.03sql
3.30表示爲3.3數據庫
3.0表示爲3後端
先後端都會改變這幾個數據。函數
一、前端實現。(JavaScript)測試
前端javascript而言,由於小數點精度計算常常有偏差,爲確保獲得2位小數點,調用了toFixed函數。可是,toFixed之後,無論小數點後是否是0,都保留2位。spa
var a = 6.02;
var b = 3.01
var c = a/b.toFixed(2) ;//c獲得了2.00
爲了獲得2,想了一個迂迴的辦法:c = a/b.toFixed(2)*100/100(若是是保留三位小數,則*1000/1000)
也能夠這麼作:
parseFloat("2.40").toFixed(2)*1 //parseFloat會去掉多餘的0,可是toFixed在實際小數位不夠的時候,會出現多餘的0
用java.text.DecimalFormat("0.##")便可。
BigDecimal a = new BigDecimal(「6.02」);
BigDecimal b = new BigDecimal(「3.01」);
與js不一樣,不能用*100/100的方式,由於java中BigDecimal的運算小數點是以公式中各項的最長小數點位數做爲最終結果的小數點位數。這樣處理後結果仍然是2位數。
用DecimalFormat(「0.##」)便可解決。
另外附上一篇其餘人的文章,你們能夠測試下:
一 java.text.DecimalFormat df=new java.text.DecimalFormat("#.##"); double d=3.14159; System.out.println(df.format(d)); 二 java.math.BigDecimal BigDecimal bd = new BigDecimal("3.14159265"); bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP); 三 class Test1{ public static void main(String[] args){ double ret = convert(3.14159); System.out.println(ret); } static double convert(double value){ long l1 = Math.round(value*100); //四捨五入 double ret = l1/100.0; //注意:使用 100.0 而不是 100 return ret; } } 四 double d = 13.4324; d=((int)(d*100))/100;