CPU表示浮點數由兩個部分組成:指數和尾數,這樣的表示方法通常都會失去必定的精確度,有些浮點數運算也會產生必定的偏差。java的float只能用來進行科學計算或工程計算,在大多數的商業計算中,通常採用java.math.BigDecimal類來進行精確計算。java
在使用BigDecimal類來進行計算的時候,主要分爲如下步驟:ide
一、float或者double構建BigDecimal對象。.net
二、調用BigDecimal的加,減,乘,除等相應的方法進行算術運算。code
三、把BigDecimal對象轉換成float,double,int等類型。對象
基本類型變量轉化爲BigDecimal變量ip
BigDecimal b1 = new BigDecimal(Double.toString(0.00)); //方法一 BigDecimal b2 = BigDecimal.valueOf(0.00);//方法二
加減乘除的幾種方法ci
public BigDecimal add(BigDecimal value);//加法 public BigDecimal subtract(BigDecimal value);//減法 public BigDecimal multiply(BigDecimal value);//乘法 public BigDecimal divide(BigDecimal value);//除法
/** * 提供精確的加法運算。 * [@param](https://my.oschina.net/u/2303379) v1 被加數 * [@param](https://my.oschina.net/u/2303379) v2 加數 * [@return](https://my.oschina.net/u/556800) 兩個參數的和 */ public static double add(double v1, double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); }
/** * 提供精確的減法運算。 * [@param](https://my.oschina.net/u/2303379) v1 被減數 * [@param](https://my.oschina.net/u/2303379) v2 減數 * @return 兩個參數的差 */ public static double sub(double v1, double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); }
/** * 提供精確的乘法運算。 * @param v1 被乘數 * @param v2 乘數 * @return 兩個參數的積 */ public static double mul(double v1, double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); }
方法一:it
/** * 提供(相對)精確的除法運算,當發生除不盡的狀況時,精確到 * 小數點之後10位,之後的數字四捨五入。 * @param v1 被除數 * @param v2 除數 * @return 兩個參數的商 */ public static double div(double v1, double v2){ return div(v1, v2, DEF_DIV_SCALE); }
方法二:io
/** * 提供(相對)精確的除法運算。當發生除不盡的狀況時,由scale參數指 * 定精度,之後的數字四捨五入。 * @param v1 被除數 * @param v2 除數 * @param scale 表示表示須要精確到小數點之後幾位。 * @return 兩個參數的商 */ public static double div(double v1, double v2, int scale){ if(scale<0){ throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); }
方法三:變量
/** * 提供精確的小數位四捨五入處理。 * @param v 須要四捨五入的數字 * @param scale 小數點後保留幾位 * @return 四捨五入後的結果 */ public static double round(double v,int scale){ if(scale<0){ throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); }
public int compareToEach(double v1, double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); int i = b1.compareTo(b2); if(i == 0) {} //b1等於b2 if(i == 1) {} //b1大於b2 if(i == -1) {} //b1小於b2 return i; }