BigDecimal的精確計算及工具類

 

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")));

	}

}
相關文章
相關標籤/搜索