本篇介紹了在JAVA中如何對double或者float的浮點數進行精度計算,在JAVA中提供了多種參數來實現精度的不同控制方式。具體例子如下:
- package com.soft4j.utility;
- import java.math.BigDecimal;
- public final class RoundTool {
- 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 static void main(String[] argc) {
- //下面都以保留2位小數爲例
- //ROUND_UP
- //只要第2位後面存在大於0的小數,則第2位就+1
- System.out.println(round( 12.3401 , 2 ,BigDecimal.ROUND_UP)); //12.35
- System.out.println(round(- 12.3401 , 2 ,BigDecimal.ROUND_UP)); //-12.35
- //ROUND_DOWN
- //與ROUND_UP相反
- //直接捨棄第2位後面的所有小數
- System.out.println(round( 12.349 , 2 ,BigDecimal.ROUND_DOWN)); //12.34
- System.out.println(round(- 12.349 , 2 ,BigDecimal.ROUND_DOWN)); //-12.34
- //ROUND_CEILING
- //如果數字>0 則和ROUND_UP作用一樣
- //如果數字<0 則和ROUND_DOWN作用一樣
- System.out.println(round( 12.3401 , 2 ,BigDecimal.ROUND_CEILING)); //12.35
- System.out.println(round(- 12.349 , 2 ,BigDecimal.ROUND_CEILING)); //-12.34
- //ROUND_FLOOR
- //如果數字>0 則和ROUND_DOWN作用一樣
- //如果數字<0 則和ROUND_UP作用一樣
- System.out.println(round( 12.349 , 2 ,BigDecimal.ROUND_FLOOR)); //12.34
- System.out.println(round(- 12.3401 , 2 ,BigDecimal.ROUND_FLOOR)); //-12.35
- //ROUND_HALF_UP [這種方法最常用]
- //如果第3位數字>=5,則第2位數字+1
- //備註:只看第3位數字的值,不會考慮第3位之後的小數的
- System.out.println(round( 12.345 , 2 ,BigDecimal.ROUND_HALF_UP)); //12.35
- System.out.println(round( 12.3449 , 2 ,BigDecimal.ROUND_HALF_UP)); //12.34
- System.out.println(round(- 12.345 , 2 ,BigDecimal.ROUND_HALF_UP)); //-12.35
- System.out.println(round(- 12.3449 , 2 ,BigDecimal.ROUND_HALF_UP)); //-12.34
- //ROUND_HALF_DOWN
- //如果第3位數字>=5,則做ROUND_UP
- //如果第3位數字<5,則做ROUND_DOWN
- System.out.println(round( 12.345 , 2 ,BigDecimal.ROUND_HALF_DOWN)); //12.35
- System.out.println(round( 12.3449 , 2 ,BigDecimal.ROUND_HALF_DOWN)); //12.34
- System.out.println(round(- 12.345 , 2 ,BigDecimal.ROUND_HALF_DOWN)); //-12.35
- System.out.println(round(- 12.3449 , 2 ,BigDecimal.ROUND_HALF_DOWN)); //-12.34
- //ROUND_HALF_EVEN
- //如果第3位是偶數,則做ROUND_HALF_DOWN
- //如果第3位是奇數,則做ROUND_HALF_UP
- System.out.println(round( 12.346 , 2 ,BigDecimal.ROUND_HALF_EVEN)); //12.35
- System.out.println(round( 12.345 , 2 ,BigDecimal.ROUND_HALF_EVEN)); //12.35
- }
- }
《Double精度的常用設置》
import java.math.BigDecimal;
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);
}
}
所以一般對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);
}