本文實例講述了Java中BigDecimal類別的簡單用法,是Java程式設計中非常實用的技巧,分享給大家供大家參考。具體用法分析如下:
一般來說,一提到Java裡面的商業計算,我們都知道不能用float和double,因為他們無法精確計算。但是Java的設計者給了程式設計人員一個很有用的類別BigDecimal,他可以完善float和double類別無法精確計算的缺失。 BigDecimal類別位於java.maths類別包下。首先我們來看看如何建構一個BigDecimal物件。它的建構子很多,這裡挑選最常用的兩個來示範:一個就是BigDecimal(double val),另一個就是BigDecimal(String str)。這兩個看起來沒什麼太大差別,但是正如API描述中說的那樣:
/*The results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly bin a so because .1 cannot be 0mented exactly as for double (exactly of that exactly 筆length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances nonwithstanding.The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(" is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one.*/也就是說利用double作為參數的建構函數,無法精確建構一個BigDecimal對象,需要自己指定一個上下文的環境,也就是指定精確位。而利用String物件作為參數傳入的建構子能精確的建構出一個BigDecimal物件。請看下面的程式碼:
import java.math.*;public class TestBigDecimal { public static void main(String args[]){ BigDecimal bd = new BigDecimal("10.123"); BigDecimal bd1 = new BigDecimal(10.123); "/n"+ bd1); }}運行後輸出:
10.123
10.1229999999999993320898283855058252811431884765625
所以我們在選擇構造函數時,要看具體需求而定。
另外,很多人會問到怎麼將基本型別,如int,float,double,long,和BigDecimal物件相互轉換。很簡單:
基本型別透過建構函式轉換成對應的BigDecimal對象,而BigDecimal類別提供了諸如intValue(), floatValue(), doubleValue(), longValue()方法來將BigDecimal物件轉換成對應的值。
關於BigDecimal是如何計算的,我以論壇中一個人的提問貼文為例,來簡單的寫出BigDecimal的運算方法。題目是:李白無事街上走,提壺去買酒。遇店加一倍,見花喝一鬥,五遇花和店,喝光壺中酒,試問李白壺中原有多少鬥酒?
這題應該是從後往前推,並且要逆運算,最後得出原有酒的體積。
import java.math.*;public class Libai { public static void main(String args[]){ BigDecimal volumn = new BigDecimal("0"); for (int i=0; i<5; i++){ volumn = volumn .add(new BigDecimal("1")); volumn = volumn.divide(new BigDecimal("2")); } System.out.print(volumn); }}運行結果:
0.96875
希望本文所述對大家Java程式設計的學習有幫助。