如何應用Java的BigDecimal類

5.8 BigDecimal類

  雙精度浮點型變量double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。表5.7中列出了BigDecimal類的主要構造器和方法。

  表5.7 BigDecimal類的主要構造器和方法

  構 造 器描 述

  BigDecimal(int)創建一個具有參數所指定整數值的對象。

  BigDecimal(double)創建一個具有參數所指定雙精度值的對象。

  BigDecimal(long)創建一個具有參數所指定長整數值的對象。

  BigDecimal(String)創建一個具有參數所指定以字符串表示的數值的對象。

  續表

  方 法描 述

  add(BigDecimal)BigDecimal對象中的值相加,然後返回這個對象。

  subtract(BigDecimal)BigDecimal對象中的值相減,然後返回這個對象。

  multiply(BigDecimal)BigDecimal對象中的值相乘,然後返回這個對象。

  divide(BigDecimal)BigDecimal對象中的值相除,然後返回這個對象。

  toString()將BigDecimal對象的數值轉換成字符串。

  doublue()將BigDecimal對象中的值以雙精度數返回。

  floatValue()將BigDecimal對象中的值以單精度數返回。

  longValue()將BigDecimal對象中的值以長整數返回。

  intValue()將BigDecimal對象中的值以整數返回。

  注意,由於一般數值類型,例如double,不能準確地代表16位有效數以上的數字,在使用BigDecimal時,應用BigDecimal(String)構造器創建對象纔有意義。另外,BigDecimal所創建的是對象,我們不能使用傳統的+、-、*、/等算術運算符直接對其對象進行數學運算,而必須調用其相對應的方法。方法中的參數也必須是BigDecimal的對象。

  構造器是類的特殊方法,專門用來創建對象,特別是帶有參數的對象。關於構造器概念和編寫技術,將在本書第6章詳細介紹。

  下面討論BigDecimal的一些常用例子:

 //完整程序例子在本書配套資源目錄Ch5中名爲BigDecimalTestApp.Java
  //創建BigDecimal對象
  BigDecimal bigNumber = new BigDecimal("89.1234567890123456789");
  BigDecimal bigRate = new BigDecimal(1000);
  BigDecimal bigResult = new BigDecimal(); //對象bigResult的值爲0.0
  //對bigNumber的值乘以1000,結果 賦予bigResult
  bigResult = bigNumber.multiply(bigRate);
  System.out.println(bigResult.toString());
  //或者System.out.println(bigResult);
  //顯示結果:89123.4567890123456789000
  //以雙精度數返回bigNumber中的值
  double dData = bigNumber.doublue();
  System.out.println(dData); //結果:89.12345678901235

  注意使用方法doublue()將對象bigNumber中的值以雙精度數值返回時,將丟失數據的準確性。使用其他方法,如xxxValue()時均存在這個問題,使用時必須慎重。

  <!--[if !vml]--><!--[endif]-->3W BigDecimal用來對超過16有效位以上的數值進行運算和操作。所有的算術運算都通過調用其相應的方法進行。創建一個超過16有效位數的對象時,運用BigDecimal(String)纔可避免丟失數字的精確度。

  5.9 BigDecimal和格式化

  由於NumberFormat類的format()方法可以使用BigDecimal對象作爲其參數,可以利用BigDecimal對超出16位有效數字的貨幣值,百分值,以及一般數值進行格式化控制。

 

 

 

java四捨五入
2009-06-20 16:11

 

package Test;

import java.math.BigDecimal; //引入這個包

public class Test {
public static void main(String[] args) {

   double i = 3.856;

   // 舍掉小數取整
   System.out.println("舍掉小數取整:Math.floor(3.856)=" + (int) Math.floor(i));

   // 四捨五入取整
   System.out.println("四捨五入取整:(3.856)="
     + new BigDecimal(i).setScale(0, BigDecimal.ROUND_HALF_UP));

   // 四捨五入保留兩位小數
   System.out.println("四捨五入取整:(3.856)="
     + new BigDecimal(i).setScale(2, BigDecimal.ROUND_HALF_UP));

   // 湊整,取上限
   System.out.println("湊整:Math.ceil(3.856)=" + (int) Math.ceil(i));

   // 舍掉小數取整
   System.out.println("舍掉小數取整:Math.floor(-3.856)=" + (int) Math.floor(-i));
   // 四捨五入取整
   System.out.println("四捨五入取整:(-3.856)="
     + new BigDecimal(-i).setScale(0, BigDecimal.ROUND_HALF_UP));

   // 四捨五入保留兩位小數
   System.out.println("四捨五入取整:(-3.856)="
     + new BigDecimal(-i).setScale(2, BigDecimal.ROUND_HALF_UP));

   // 湊整,取上限
   System.out.println("湊整(-3.856)=" + (int) Math.ceil(-i));
 

 

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