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



}


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/suliqiang/archive/2006/05/08/713229.aspx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章