java 中的小數點、大數、隨機數處理


1.小數點處理

 1 public class Test { 
 2 
 3 public static void main(String[] args) {
 4 
 5 double i = 3.856;
 6 
 7 // 舍掉小數取整 
 8 System.out.println("舍掉小數取整:Math.floor(3.856)=" + (int) Math.floor(i));
 9 
10 // 四舍五入取整 
11 System.out.println("四舍五入取整:(3.856)=" 
12 + new BigDecimal(i).setScale(0, BigDecimal.ROUND_HALF_UP));
13 
14 // 四舍五入保留兩位小數 
15 System.out.println("四舍五入取整:(3.856)=" 
16 + new BigDecimal(i).setScale(2, BigDecimal.ROUND_HALF_UP));
17 
18 // 湊整,取上限 
19 System.out.println("湊整:Math.ceil(3.856)=" + (int) Math.ceil(i));
20 
21 // 舍掉小數取整 
22 System.out.println("舍掉小數取整:Math.floor(-3.856)=" + (int) Math.floor(-i)); 
23 // 四舍五入取整 
24 System.out.println("四舍五入取整:(-3.856)=" 
25 + new BigDecimal(-i).setScale(0, BigDecimal.ROUND_HALF_UP));
26 
27 // 四舍五入保留兩位小數 
28 System.out.println("四舍五入取整:(-3.856)=" 
29 + new BigDecimal(-i).setScale(2, BigDecimal.ROUND_HALF_UP));
30 
31 // 湊整,取上限 
32 System.out.println("湊整(-3.856)=" + (int) Math.ceil(-i));

2.大數處理

2.1 BigInteger

  Java中在BigInteger類中封裝了多種操作,除了基本的加、減、乘、除操作之外,還提供了絕對值、相反數、最大公約數以及判斷是否為質數等操作。 當使用BigInteger類時,可以實例化一個BigInteger對象,並自動調用相應的構造函數。BigInteger類具有很多構造函數,但最直接的一種方式是參數以字符串形式代表要處理的數字;

  BigDecimal和BigInteger都能實現大數字的運算,不同的是BigDecimal加入了小數的概念。一般的float型和double型數據只可以用來做科學計算或工程計算,但由於在商業計算中要求數字精度比較高,所以要用到java.math.BigDecimal類。BigDecimal類支持任何精度的定點數,可以用它來精確計算貨幣值。

例:

 1 public class BigIntegerDemo {
 2     public static void main(String[] args) {
 3         BigInteger bigInstance = new BigInteger("4"); // 實例化一個大數字
 4         // 取該大數字加2的操作
 5         System.out.println("加法操作:" + bigInstance.add(new BigInteger("2")));
 6         // 取該大數字減2的操作
 7         System.out.println("減法操作:"
 8                 + bigInstance.subtract(new BigInteger("2")));
 9         // 取該大數字乘以2的操作
10         System.out.println("乘法操作:"
11                 + bigInstance.multiply(new BigInteger("2")));
12         // 取該大數字除以2的操作
13         System.out.println("除法操作:"
14                 + bigInstance.divide(new BigInteger("2")));
15         // 取該大數字除以3的商
16         System.out.println("取商:"
17                 + bigInstance.divideAndRemainder(new BigInteger("3"))[0]);
18         // 取該大數字除以3的余數
19         System.out.println("取余數:"
20                 + bigInstance.divideAndRemainder(new BigInteger("3"))[1]);
21         // 取該大數字的2次方
22         System.out.println("做2次方操作:" + bigInstance.pow(2));
23         // 取該大數字的相反數
24         System.out.println("取相反數操作:" + bigInstance.negate());
25     }
26 }

運行結果;

加法操作:6
減法操作:2
乘法操作:8
除法操作:2
取商:1
取余數:1
做2次方操作:16
取相反數操作:-4

2.2BigDecimal

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

  BigDecimal類的主要構造器和方法

(1)構造器描 述

 

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

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

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

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

(2)方 法描 述

  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)才可避免丟失數字的精確度。

(3)BigDecimal和格式化

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

3.隨機數

3.1 random()方法

  在Math類中存在一個random()方法,用於產生隨機數字,這個方法默認生成大於等於0.0小於1.0的double型隨機數,即0<=Math.random()<1.0,雖然Math.random()方法只可以產生0~1之間的double型數字,其實只要在Math.random()語句上稍加處理,就可以使用這個方法產生任意范圍的隨機數。

    

  例:

 1 public class MathRondom {
 2     /**
 3      * 定義產生偶數的方法
 4      * @param num1 起始范圍參數
 5      * @param num2 終止范圍參數
 6      * @return 隨即的范圍內偶數
 7      */
 8     public static int GetEvenNum(double num1, double num2) {
 9         // 產生num1~num2之間的隨機數
10         int s = (int) num1 + (int) (Math.random() * (num2 - num1)); 
11         if (s % 2 == 0) { // 判斷隨機數是否為偶數
12             return s; // 返回
13         } else
14             // 如果是奇數
15             return s + 1; // 將結果加1后返回
16     }
17     
18     public static void main(String[] args) {
19         // 調用產生隨機數方法
20         System.out.println("任意一個2~32之間的偶數:" + GetEvenNum(2, 32));
21     }
22 }

  運行結果:

  任意一個2~32之間的偶數:18   (或指定范圍內其他數字)

  分析:同上述方法一致,也可以產生a~z之間的字符串    (char)('a'+Math.random()*('z' - 'a' + 1));

  或A~Z之間的隨機數  (char)(char1+Math.random()*(char2 - char1 +1));例如下面的代碼:

  

 1 public class MathRandomChar {
 2     // 定義獲取任意字符之間的隨機字符
 3     public static char GetRandomChar(char cha1, char cha2) {
 4         return (char) (cha1 + Math.random() * (cha2 - cha1 + 1));
 5     }
 6     
 7     public static void main(String[] args) {
 8         // 獲取a~z之間的隨機字符
 9         System.out.println("任意小寫字符" + GetRandomChar('a', 'z'));
10         // 獲取A~Z之間的隨機字符
11         System.out.println("任意大寫字符" + GetRandomChar('A', 'Z'));
12         // 獲取0~9之間的隨機字符
13         System.out.println("0到9任意數字字符" + GetRandomChar('0', '9'));
14     }
15 }

  運行結果:

  任意小寫字符p
  任意大寫字符X
  0到9任意數字字符9(或其他結果

3.2.Random類

  除了Math類中的random()方法可以獲取隨機數之外,在Java中還提供了一種可以獲取隨機數的方式,那就是java.util.Random類。可以通過實例化一個Random對象創建一個隨機數生成器。 語法如下: Random r=new Random(); 其中,r是指Random對象。例如下面代碼:

  

 1 public class RandomDemo {
 2     public static void main(String[] args) {
 3         Random r = new Random(); // 實例化一個Random類
 4         // 隨機產生一個整數
 5         System.out.println("隨機產生一個整數:" + r.nextInt());
 6         // 隨機產生一個大於等於0小於10的整數
 7         System.out.println("隨機產生一個大於等於0小於10的整數:" + r.nextInt(10));
 8         // 隨機產生一個布爾型的值
 9         System.out.println("隨機產生一個布爾型的值:" + r.nextBoolean());
10         // 隨機產生一個雙精度型的值
11         System.out.println("隨機產生一個雙精度型的值:" + r.nextDouble());
12         // 隨機產生一個浮點型的值
13         System.out.println("隨機產生一個浮點型的值:" + r.nextFloat());
14         // 隨機產生一個概率密度為高斯分布的雙精度值
15         System.out.println("隨機產生一個概率密度為高斯分布的雙精度值:"
16                 + r.nextGaussian());
17     }
18 }

  運行結果:

隨機產生一個整數:1007862560
隨機產生一個大於等於0小於10的整數:3
隨機產生一個布爾型的值:false
隨機產生一個雙精度型的值:0.7102648045789365
隨機產生一個浮點型的值:0.31149262
隨機產生一個概率密度為高斯分布的雙精度值:-0.2646002913429201

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM