Float型別*100的坑 (BigDecimal 的使用)和float形的格式化

pszh發表於2016-06-28

近日,做專案的時候處理一個Float型別的資料,因為要顯示成 % 的形式,直接*100 的話出現了精度丟失問題。就像這樣:



這個時候我們就是需要使用BigDecimal 類了  

 下面的方法就可以:

BigDecimal re1=new BigDecimal(Float.toString(0.142f));
BigDecimal re2=new BigDecimal(Float.toString(100.00f));
System.out.println(re1.multiply(re2).floatValue());


下面具體介紹下這個類:

BigDecimal一共有4個構造方法

BigDecimal(int) 建立一個具有引數所指定整數值的物件。
BigDecimal(double) 建立一個具有引數所指定雙精度值的物件。
BigDecimal(long) 建立一個具有引數所指定長整數值的物件。
BigDecimal(String) 建立一個具有引數所指定以字串表示的數值的物件。

BigDecimal 的運算方式 不支援 + - * / 這類的運算 它有自己的運算方法

BigDecimal add(BigDecimal augend) 加法運算
BigDecimal subtract(BigDecimal subtrahend) 減法運算
BigDecimal multiply(BigDecimal multiplicand) 乘法運算
BigDecimal divide(BigDecimal divisor) 除法運算

格式化(貨幣,百分比 的用法)


<span style="white-space:pre">		</span>BigDecimal bigLoanAmount = new BigDecimal("12.11");   //建立BigDecimal物件
		BigDecimal bigInterestRate = new BigDecimal("23.15");
		BigDecimal bigInterest = bigLoanAmount.multiply(bigInterestRate); //BigDecimal運算
		NumberFormat currency = NumberFormat.getCurrencyInstance();    //建立貨幣格式化引用
		NumberFormat percent = NumberFormat.getPercentInstance();     //建立百分比格式化用
		percent.setMaximumFractionDigits(3);               //百分比小數點最多3位
		//利用BigDecimal物件作為引數在format()中呼叫貨幣和百分比格式化
		System.out.println("Loan amount:\t" + currency.format(bigLoanAmount));
		System.out.println("Interest rate:\t" + percent.format(bigInterestRate));
		System.out.println("Interest:\t" + currency.format(bigInterest));

小數位的取值,其他位的舍入

BigDecimal a= new BigDecimal("1.35");
對數值取值:
1.a.getScale(1,BigDecimal.ROUND_DOWN);
取一位小數,直接刪除後面多餘位數,故取值1.3.
2.a.getScale(1,BigDecimal.ROUND_UP);
取一位小數,刪除後面位數,進一位,故取值1.4.
3.a.getScale(1,BigDecimal.ROUND_HALF_UP);
取一位小數,四捨五入,故取值1.4.
4.a.getScale(1,BigDecimal.ROUND_HALF_DOWN);
取一位小數,四捨五入,但是5也是捨棄,故取值1.3.

BigDecimal 轉double型別

使用BigDecimal.doubleValue()的方法

float的格式化

上面說的BigDecimal可以對Float格式化,還可以使用new DecimalFormat("##0.00").format(.01); 這個格式化之後就是 0.01

相關文章