BigDecimal

 BigDecimal 由任意精度的整數非標度值 和32 位的整數標度 (scale) 組成。如果爲零或正數,則標度是小數點後的位數。

如果爲負數,則將該數的非標度值乘以 10 的負scale 次冪。因此,BigDecimal表示的數值是(unscaledValue × 10-scale)


構造 BigDecimal 對象常用以下方法:
BigDecimal BigDecimal(double d); //不允許使用
BigDecimal BigDecimal(String s); //常用,推薦使用
static BigDecimal valueOf(double d); //常用,推薦使用


 

/**
 * 求餘數
 * 返回值爲 (this % divisor) 的 BigDecimal
 */
BigDecimal remainder(BigDecimal divisor);

/**
 * 求相反數
 * 返回值是 (-this) 的 BigDecimal
 */
BigDecimal negate();

/**
 * 將此 BigDecimal 與指定的 BigDecimal 比較
 * 根據此方法,值相等但具有不同標度的兩個 BigDecimal 對象(如,2.0 和 2.00)被認爲是相等的;
 * 相對六個 boolean 比較運算符 (<, ==, >, >=, !=, <=) 中每一個運算符的各個方法,優先提供此方法;
 * 建議使用以下語句執行上述比較:(x.compareTo(y) <op> 0), 其中 <op> 是六個比較運算符之一;
 *
 * 指定者:接口 Comparable<BigDecimal> 中的 compareTo
 * 返回:當此 BigDecimal 在數字上小於、等於或大於 val 時,返回 -1、0 或 1
 */
int compareTo(BigDecimal val);
package com.util;

import java.math.BigDecimal;

/**
 * 提供精確的浮點數運算(包括加、減、乘、除、四捨五入)工具類
 */
public class ArithUtil {

	// 除法運算默認精度
	private static final int DEF_DIV_SCALE = 10;

	private ArithUtil() {

	}

	/**
	 * 精確加法
	 */
	public static double add(double value1, double value2) {
		BigDecimal b1 = BigDecimal.valueOf(value1);
		BigDecimal b2 = BigDecimal.valueOf(value2);
		return b1.add(b2).doubleValue();
	}

	/**
	 * 精確減法
	 */
	public static double sub(double value1, double value2) {
		BigDecimal b1 = BigDecimal.valueOf(value1);
		BigDecimal b2 = BigDecimal.valueOf(value2);
		return b1.subtract(b2).doubleValue();
	}

	/**
	 * 精確乘法
	 */
	public static double mul(double value1, double value2) {
		BigDecimal b1 = BigDecimal.valueOf(value1);
		BigDecimal b2 = BigDecimal.valueOf(value2);
		return b1.multiply(b2).doubleValue();
	}

	/**
	 * 精確除法 使用默認精度
	 */
	public static double div(double value1, double value2) throws IllegalAccessException {
		return div(value1, value2, DEF_DIV_SCALE);
	}

	/**
	 * 精確除法
	 * @param scale 精度
	 */
	public static double div(double value1, double value2, int scale) throws IllegalAccessException {
		if(scale < 0) {
			throw new IllegalAccessException("精確度不能小於0");
		}
		BigDecimal b1 = BigDecimal.valueOf(value1);
		BigDecimal b2 = BigDecimal.valueOf(value2);
		// return b1.divide(b2, scale).doubleValue();
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 四捨五入
	 * @param scale 小數點後保留幾位
	 */
	public static double round(double v, int scale) throws IllegalAccessException {
		return div(v, 1, scale);
	}
	
	/**
	 * 比較大小
	 */
	public static boolean equalTo(BigDecimal b1, BigDecimal b2) {
		if(b1 == null || b2 == null) {
			return false;
		}
		return 0 == b1.compareTo(b2);
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章