JAVA中精確的浮點運算__JAVA

來源:互聯網
上載者:User

java中浮點運算對於很多值浮點數都是採用其能夠表示的離目標值最近的數來表示,這有可能會在計算中帶來不易覺察的誤差。

如下所例:

public class ssss {public static void main(String[] ages){double d1=2.07;double d2=1.03;System.out.println(d1+d2);}}


 

結果:

 

 

雖然計算結果離精確值誤差很小,但其不是精確的。這在像如金融計算一樣計算精確度要求很高的領域是無法接受的,但這是二進位本身的問題,而電腦普遍採用二進位表示,使用基礎資料型別 (Elementary Data Type)無法解決。

 

 

為瞭解決基礎資料型別 (Elementary Data Type)浮點數不能進行精確計算的問題,Java中專門提供了java.math.BigDecimal類,其提供浮點數的精確計算功能。與BigInteger類相同,其運算操作均使用方法調用完成

 

 

demo

public class ssss {public static void main(String[] ages){BigDecimal b1=new BigDecimal("2.07");BigDecimal b2=new BigDecimal("1.03");System.out.println("相加運算:");System.out.println("b1:"+b1);System.out.println("b2:"+b2);System.out.println("相加值:"+b1.add(b2));}}


 

 

輸出值:

 

 

 

 

其餘函數參造下表

 

 

 BigDecimal abs()
          返回 BigDecimal,其值為此 BigDecimal 的絕對值,其標度為 this.scale()。
 BigDecimal abs(MathContext mc)
          返回其值為此 BigDecimal 絕對值的 BigDecimal(根據上下文設定進行舍入)。
 BigDecimal add(BigDecimal augend)
          返回一個 BigDecimal,其值為 (this + augend),其標度為 max(this.scale(), augend.scale())。
 BigDecimal add(BigDecimal augend, MathContext mc)
          返回其值為 (this + augend) 的 BigDecimal(根據上下文設定進行舍入)。
 byte byteValueExact()
          將此 BigDecimal 轉換為 byte,以檢查丟失的資訊。
 int compareTo(BigDecimal val)
          將此 BigDecimal 與指定的 BigDecimal 比較。
 BigDecimal divide(BigDecimal divisor)
          返回一個 BigDecimal,其值為 (this / divisor),其首選標度為 (this.scale() - divisor.scale());如果無法表示準確的商值(因為它有無窮的十進位擴充),則拋出 ArithmeticException。
 BigDecimal divide(BigDecimal divisor, int roundingMode)
          返回一個 BigDecimal,其值為 (this / divisor),其標度為 this.scale()。
 BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
          返回一個 BigDecimal,其值為 (this / divisor),其標度為指定標度。
 BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
          返回一個 BigDecimal,其值為 (this / divisor),其標度為指定標度。
 BigDecimal divide(BigDecimal divisor, MathContext mc)
          返回其值為 (this / divisor) 的 BigDecimal(根據上下文設定進行舍入)。
 BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode)
          返回一個 BigDecimal,其值為 (this / divisor),其標度為 this.scale()。
 BigDecimal[] divideAndRemainder(BigDecimal divisor)
          返回由兩個元素組成的 BigDecimal 數組,該數組包含 divideToIntegralValue 的結果,後跟對兩個運算元計算所得到的 remainder。
 BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc)
          返回由兩個元素組成的 BigDecimal 數組,該數組包含 divideToIntegralValue 的結果,後跟根據上下文設定對兩個運算元進行舍入計算所得到的 remainder 的結果。
 BigDecimal divideToIntegralValue(BigDecimal divisor)
          返回 BigDecimal,其值為向下舍入所得商值 (this / divisor) 的整數部分。
 BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc)
          返回 BigDecimal,其值為 (this / divisor) 的整數部分。
 double doubleValue()
          將此 BigDecimal 轉換為 double。
 boolean equals(Object x)
          比較此 BigDecimal 與指定的 Object 的相等性。
 float floatValue()
          將此 BigDecimal 轉換為 float。
 int hashCode()
          返回此 BigDecimal 的雜湊碼。
 int intValue()
          將此 BigDecimal 轉換為 int。
 int intValueExact()
          將此 BigDecimal 轉換為 int,以檢查丟失的資訊。
 long longValue()
          將此 BigDecimal 轉換為 long。
 long longValueExact()
          將此 BigDecimal 轉換為 long,以檢查丟失的資訊。
 BigDecimal max(BigDecimal val)
          返回此 BigDecimal 和 val 的最大值。
 BigDecimal min(BigDecimal val)
          返回此 BigDecimal 和 val 的最小值。
 BigDecimal movePointLeft(int n)
          返回一個 BigDecimal,它等效於將該值的小數點向左移動 n 位。
 BigDecimal movePointRight(int n)
          返回一個 BigDecimal,它等效於將該值的小數點向右移動 n 位。
 BigDecimal multiply(BigDecimal multiplicand)
          返回一個 BigDecimal,其值為 (this × multiplicand),其標度為 (this.scale() + multiplicand.scale())。
 BigDecimal multiply(BigDecimal multiplicand, MathContext mc)
          返回其值為 (this × multiplicand) 的 BigDecimal(根據上下文設定進行舍入)。
 BigDecimal negate()
          返回 BigDecimal,其值為 (-this),其標度為 this.scale()。
 BigDecimal negate(MathContext mc)
          返回其值為 (-this) 的 BigDecimal(根據上下文設定進行舍入)。
 BigDecimal plus()
          返回 BigDecimal,其值為 (+this),其標度為 this.scale()。
 BigDecimal plus(MathContext mc)
          返回其值為 (+this) 的 BigDecimal(根據上下文設定進行舍入)。
 BigDecimal pow(int n)
          返回其值為 (thisn) 的 BigDecimal,準確計算該冪,使其具有無限精度。
 BigDecimal pow(int n, MathContext mc)
          返回其值為 (thisn) 的 BigDecimal。
 int precision()
          返回此 BigDecimal 的精度。
 BigDecimal remainder(BigDecimal divisor)
          返回其值為 (this % divisor) 的 BigDecimal。
 BigDecimal remainder(BigDecimal divisor, MathContext mc)
          返回其值為 (this % divisor) 的 BigDecimal(根據上下文設定進行舍入)。
 BigDecimal round(MathContext mc)
          返回根據 MathContext 設定進行舍入後的 BigDecimal。
 int scale()
          返回此 BigDecimal 的標度。
 BigDecimal scaleByPowerOfTen(int n)
          返回其數值等於 (this * 10n) 的 BigDecimal。
 BigDecimal setScale(int newScale)
          返回一個 BigDecimal,其標度為指定值,其值在數值上等於此 BigDecimal 的值。
 BigDecimal setScale(int newScale, int roundingMode)
          返回一個 BigDecimal,其標度為指定值,其非標度值通過此 BigDecimal 的非標度值乘以或除以十的適當次冪來確定,以維護其總值。
 BigDecimal setScale(int newScale, RoundingMode roundingMode)
          返回 BigDecimal,其標度為指定值,其非標度值通過此 BigDecimal 的非標度值乘以或除以十的適當次冪來確定,以維護其總值。
 short shortValueExact()
          將此 BigDecimal 轉換為 short,以檢查丟失的資訊。
 int signum()
          返回此 BigDecimal 的加號或減號函數。
 BigDecimal stripTrailingZeros()
          返回數值上等於此小數,但從該表示形式移除所有尾部零的 BigDecimal。
 BigDecimal subtract(BigDecimal subtrahend)
          返回一個 BigDecimal,其值為 (this - subtrahend),其標度為 max(this.scale(), subtrahend.scale())。
 BigDecimal subtract(BigDecimal subtrahend, MathContext mc)
          返回其值為 (this - subtrahend) 的 BigDecimal(根據上下文設定進行舍入)。
 BigInteger toBigInteger()
          將此 BigDecimal 轉換為 BigInteger。
 BigInteger toBigIntegerExact()
          將此 BigDecimal 轉換為 BigInteger,以檢查丟失的資訊。
 String toEngineeringString()
          返回此 BigDecimal 的字串表示形式,需要指數時,則使用工程計數法。
 String toPlainString()
          返回不帶指數欄位的此 BigDecimal 的字串表示形式。
 String toString()
          返回此 BigDecimal 的字串表示形式,如果需要指數,則使用科學記號標記法。
 BigDecimal ulp()
          返回此 BigDecimal 的 ulp(最後一位的單位)的大小。
 BigInteger unscaledValue()
          返回其值為此 BigDecimal 的非標度值 的 BigInteger。
static BigDecimal valueOf(double val)
          使用 Double.toString(double) 方法提供的 double 規範的字串表示形式將 double 轉換為 BigDecimal。
static BigDecimal valueOf(long val)
          將 long 值轉換為具有零標度的 BigDecimal。
static BigDecimal valueOf(long unscaledVal, int scale)
          將 long 非標度值和 int 標度轉換為 BigDecimal。

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.