System.out.println(new BigDecimal("10000000000").toString()); System.out.println( new BigDecimal("100.000").toString()); System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString()); System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());
輸出:java
10000000000 100.000 1E+2 100
BigDecimal是處理高精度的浮點數運算的經常使用的一個類
當須要將BigDecimal中保存的浮點數值打印出來,特別是在頁面上顯示的時候,就有可能遇到預想以外的科學技術法表示的問題。
通常直接使用 BigDecimal.toString()方法便可以完成浮點數的打印。如:
System.out.println( new BigDecimal("10000000000").toString());
可是,toString()方法輸出的字符串並不能保證不是科學計數法。
不過在平常的使用中,用toString()方法輸出的就是普通的數字字符串而非科學計數法。直接這麼寫:
System.out.println( new BigDecimal("100.000").toString());
程序的輸出即爲: 100.000
若是咱們但願去除末尾多餘的0,那麼咱們應該這麼寫:
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString());
其中,stripTrailingZeros()函數就是用於去除末尾多餘的0的,可是此時程序的輸出爲: 1E+2
是科學計數法,可能並非咱們想要的。
解決的方法很簡單,若是想要避免輸出科學計數法的字符串,咱們要用toPlainString()函數代替toString()。如:
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());
此時程序的輸出就爲 100git
若是想要輸出的是100.00 強制保留2位小數,則須要DecimalFormat。web
System.out.println(new DecimalFormat("0.00").format(new BigDecimal("100.000")));
輸出:bash
100.00
DecimalFormat中的「0」 「#」意義:ide
Symbol Location Localized? Meaning 0 Number Yes Digit # Number Yes Digit, zero shows as absent
簡單說,0的沒有的補零,#的沒有就缺席沒有(不顯示)。函數
new java.text.DecimalFormat("#.###").format(3.0) new java.text.DecimalFormat("0.000").format(3.0)
輸出的結果卻爲: 3 和 3.000 。工具
BigDecimalUtils工具類code
package com.imddy.tweb.util; import java.math.BigDecimal; import java.text.DecimalFormat; public class BigDecimalUtils { // 默認精度10, 應該是2,4, 特別是作金額計算,到分和到毫 public static final int DEFAULT_SCALE = 10; public static final int DEFAULT_DIV_SCALE = 10; // 默認的格式化字符樣式 「#。00」 還能夠是像「#。0000」 public static final String DEFAULT_FORMAT_STR = "#.00"; // 加法 public static BigDecimal add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2); } // 減法 public static BigDecimal sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2); } // 乘法 public static BigDecimal mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2); } // 除法,默認精度 public static BigDecimal div(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_UP); } // 對一個double截取指定的長度,利用除以1實現 public static BigDecimal round(double v1, int scale) { if (scale < 0) { new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal("1"); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP); } // 除法,自定義精度 public static BigDecimal div(double v1, double v2, int scale) { if (scale < 0) { 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); } // 比較2個double值,相等返回0,大於返回1,小於返回-1 public static int compareTo(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.compareTo(b2); } // 判斷2個double的值相等這裏要改,相等返回true,不然返回false public static boolean valuesEquals(double v1, double v2) { boolean result; BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); int resultInt = b1.compareTo(b2); if (resultInt == 0) { result = true; } else { result = false; } return result; } // 判斷2個double的值,v1大於v2返回true,不然返回false public static boolean valuesGreater(double v1, double v2) { boolean result; BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); int resultInt = b1.compareTo(b2); if (resultInt > 0) { result = true; } else { result = false; } return result; } // 判斷2個double的值,v1小於v2返回true,不然返回false public static boolean valuesLess(double v1, double v2) { boolean result; BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); int resultInt = b1.compareTo(b2); if (resultInt < 0) { result = true; } else { result = false; } return result; } // DecimalFormat格式化,使用默認的格式樣式 public static String format(Object object) { return new DecimalFormat(DEFAULT_FORMAT_STR).format(object); } // DecimalFormat格式化,使用傳入的字符串格式樣式 public static String format(Object object, String formatStr) { return new DecimalFormat(formatStr).format(object); } public static void main(String[] args) { double a = 178.63; double b = 3.251; System.out.println(BigDecimalUtils.add(a, b)); System.out.println(BigDecimalUtils.sub(a, b)); System.out.println(BigDecimalUtils.mul(a, b)); System.out.println(BigDecimalUtils.div(a, b)); System.out.println(BigDecimalUtils.div(a, b, 5)); // 不能以double來構建BigDecimal,只能由string來構建BigDecimal System.out.println(new BigDecimal(Double.valueOf(a))); System.out.println(new BigDecimal(Double.toString(a))); System.out.println(new BigDecimal(Double.toString(a)).toString()); System.out.println(BigDecimalUtils.compareTo(a, b)); System.out.println(BigDecimalUtils.compareTo(b, a)); System.out.println(BigDecimalUtils.valuesEquals(0.002, 0.0020)); System.out.println(BigDecimalUtils.valuesGreater(a, b)); System.out.println(BigDecimalUtils.valuesLess(a, b)); // System.out.println( BigDecimalUtils.mul(0.03, 0.0002).stripTrailingZeros().toPlainString() ); System.out.println( BigDecimalUtils.mul(0.03, 0.0002).stripTrailingZeros() ); System.out.println( BigDecimalUtils.mul(0.03, 0.0002).stripTrailingZeros().toString() ); System.out.println("----------"); System.out.println(new BigDecimal("10000000000").toString()); System.out.println( new BigDecimal("100.000").toString()); System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString()); System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString()); System.out.println(new DecimalFormat("0.00").format(new BigDecimal("100.000"))); System.out.println(new DecimalFormat("#.00").format(new BigDecimal("100.000"))); } }