當前位置:編程學習大全網 - 源碼下載 - BigInteger與BigDecimal

BigInteger與BigDecimal

BigInteger - 廖雪峰的網站

在Java中,由CPU原生提供的整型最大範圍是64位 long 型整數。使用 long 型整數可以直接通過CPU指令進行計算,速度非常快。

如果我們使用的整數範圍超過了 long 型怎麽辦?這個時候,就只能用軟件來模擬壹個大整數。 java.math.BigInteger 就是用來表示任意大小的整數。 BigInteger 內部用壹個 int[] 數組來模擬壹個非常大的整數:

對 BigInteger 做運算的時候,只能使用實例方法,例如,加法運算:

和 long 型整數運算比, BigInteger 不會有範圍限制,但缺點是速度比較慢。

也可以把 BigInteger 轉換成 long 型:

使用 longValueExact() 方法時,如果超出了 long 型的範圍,會拋出 ArithmeticException 。

BigInteger 和 Integer 、 Long 壹樣,也是不可變類,並且也繼承自 Number 類。因為 Number 定義了轉換為基本類型的幾個方法:

因此,通過上述方法,可以把 BigInteger 轉換成基本類型。如果 BigInteger 表示的範圍超過了基本類型的範圍,轉換時將丟失高位信息,即結果不壹定是準確的。如果需要準確地轉換成基本類型,可以使用 intValueExact() 、 longValueExact() 等方法,在轉換時如果超出範圍,將直接拋出 ArithmeticException 異常。

如果 BigInteger 的值甚至超過了 float 的最大範圍,那麽返回的 float 是什麽呢?

和 BigInteger 類似, BigDecimal 可以表示壹個任意大小且精度完全準確的浮點數。

通過 BigDecimal 的 stripTrailingZeros() 方法,可以將壹個 BigDecimal 格式化為壹個相等的,但去掉了末尾0的 BigDecimal :

如果壹個 BigDecimal 的 scale() 返回負數,例如, -2 ,表示這個數是個整數,並且末尾有2個0。

可以對壹個 BigDecimal 設置它的 scale ,如果精度比原始值低,那麽按照指定的方法進行四舍五入或者直接截斷:

對 BigDecimal 做加、減、乘時,精度不會丟失,但是做除法時,存在無法除盡的情況,這時,就必須指定精度以及如何進行截斷:

還可以對 BigDecimal 做除法的同時求余數:

調用 divideAndRemainder() 方法時,返回的數組包含兩個 BigDecimal ,分別是商和余數,其中商總是整數,余數不會大於除數。我們可以利用這個方法判斷兩個 BigDecimal 是否是整數倍數:

在比較兩個 BigDecimal 的值是否相等時,要特別註意,使用 equals() 方法不但要求兩個 BigDecimal 的值相等,還要求它們的 scale() 相等:

必須使用 compareTo() 方法來比較,它根據兩個值的大小分別返回負數、正數和0,分別表示小於、大於和等於。

總是使用 compareTo() 比較兩個 BigDecimal 的值,不要使用 equals() !

如果查看 BigDecimal 的源碼,可以發現,實際上壹個 BigDecimal 是通過壹個 BigInteger 和壹個 scale 來表示的,即 BigInteger 表示壹個完整的整數,而 scale 表示小數位數:

BigDecimal 也是從 Number 繼承的,也是不可變對象。

  • 上一篇:MySQL中innodb的行鎖算法
  • 下一篇:線性回歸公式是什麽啊?
  • copyright 2024編程學習大全網