我只是一個簡單的Coder,為了興趣和理想奮鬥在生活的道路上
阿新 • • 發佈:2019-01-01
BigDecimal類
BigDecimal的加減乘除
import java.math.BigDecimal; public class Arith { /** * 由於Java的簡單型別不能夠精確的對浮點數進行運算,這個工具類提供精 * 確的浮點數運算,包括加減乘除和四捨五入。 */ //預設除法運算精度 private static final int DEF_DIV_SCALE = 10; //這個類不能例項化 private Arith(){ } /** * 提供精確的加法運算。 * @param v1 被加數 * @param v2 加數 * @return 兩個引數的和 */ 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 v1 被減數 * @param 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(); } /** * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 * 小數點以後10位,以後的數字四捨五入。 * @param v1 被除數 * @param v2 除數 * @return 兩個引數的商 */ public static double div(double v1,double v2){ return div(v1,v2,DEF_DIV_SCALE); } /** * 提供(相對)精確的除法運算。當發生除不盡的情況時,由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(); } /** * 提供精確的型別轉換(Float) * @param v 需要被轉換的數字 * @return 返回轉換結果 */ public static float convertsToFloat(double v){ BigDecimal b = new BigDecimal(v); return b.floatValue(); } /** * 提供精確的型別轉換(Int)不進行四捨五入 * @param v 需要被轉換的數字 * @return 返回轉換結果 */ public static int convertsToInt(double v){ BigDecimal b = new BigDecimal(v); return b.intValue(); } /** * 提供精確的型別轉換(Long) * @param v 需要被轉換的數字 * @return 返回轉換結果 */ public static long convertsToLong(double v){ BigDecimal b = new BigDecimal(v); return b.longValue(); } /** * 返回兩個數中大的一個值 * @param v1 需要被對比的第一個數 * @param v2 需要被對比的第二個數 * @return 返回兩個數中大的一個值 */ public static double returnMax(double v1,double v2){ BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.max(b2).doubleValue(); } /** * 返回兩個數中小的一個值 * @param v1 需要被對比的第一個數 * @param v2 需要被對比的第二個數 * @return 返回兩個數中小的一個值 */ public static double returnMin(double v1,double v2){ BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.min(b2).doubleValue(); } /** * 精確對比兩個數字 * @param v1 需要被對比的第一個數 * @param v2 需要被對比的第二個數 * @return 如果兩個數一樣則返回0,如果第一個數比第二個數大則返回1,反之返回-1 */ public static int compareTo(double v1,double v2){ BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.compareTo(b2); } }
BigDecimal小數點處理
BigDecimal.setScale()方法用於格式化小數點setScale(1)表示保留一位小數,預設用四捨五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接刪除多餘的小數位,如2.35會變成2.3
setScale(1,BigDecimal.ROUND_UP)進位處理,2.35變成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四捨五入,2.35變成2.4 setScaler(1,BigDecimal.ROUND_HALF_DOWN)四捨五入,2.35變成2.3,如果是5則向下舍
比如:BigDecimal b = new BigDecimal("123.456"); b.scale(),返回的就是3.
2:roundingMode是小數的保留模式。它們都是BigDecimal中的常量欄位,有很多種。
比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。
3:pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
的意思是說:我用一個BigDecimal物件除以divisor後的結果,並且要求這個結果保留有scale個小數位,roundingMode表示的就是保留模式是什麼,是四捨五入啊還是其它的,你可以自己選!
4:對於一般add、subtract、multiply方法的小數位格式化如下:
BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);System.out.println("mData=" + mData); ----結果:----- mData=9.66