轉:java.math.BigDecimal的精度問題

1.
	 String myMoney = "100.0128";
	  BigDecimal money= new BigDecimal(myMoney);
	  //設置精度,以及舍入規則
	  money= money.setScale(2, BigDecimal.ROUND_HALF_UP);
	  System.out.println(money);
	  //100.01

	2. double myMoney = 100.0128;
	   myMoney  = Math.round(myMoney  * 100) / (double) 100  ;
	    BigDecimal money= new BigDecimal(myMoney);
	    System.out.println(money); //後面則有很多的小數
	   //爲了保證小數位數爲2位
	   BigDecimal money= new BigDecimal(Double.toString(myMoney));
	    System.out.println(money); //小數位數則爲2位
	這個類確實好用。在網上找到大的,是一個女Java程序員寫的。厲害~~~~~~哈哈
	/*
	 * 創建日期 2004-10-14
	 *
	 * 如果需要精確計算,非要用String來夠造BigDecimal不可
	 */
	package com.lims.actions.testqc.comm;
	/**
	 * @author Jstar
	 *
	 * 
	 * 窗口 > 首選項 > Java > 代碼生成 > 代碼和註釋
	 */
	import java.math.BigDecimal;
	/**
	* 由於Java的簡單類型不能夠精確的對浮點數進行運算,這個工具類提供精
	* 確的浮點數運算,包括加減乘除和四捨五入。
	*/
	public class Arith {
	 //默認除法運算精度
	 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 b = new BigDecimal(Double.toString(v));
	  BigDecimal one = new BigDecimal("1");
	  return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	 }

 

發佈了45 篇原創文章 · 獲贊 0 · 訪問量 1461
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章